![]() |
|
Модераторы: skyboy |
![]()
|
|
| shurale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.8.2006 Где: Израиль Репутация: нет Всего: нет |
Есть таблица - 100 000 записей, MYSQL 4.0.24
Делается запрос - SELECT id,..... FROM users WHERE area='xxx' AND phone_preff='xxx' AND age BETWEEN x AND y ORDER BY timeregistered DESC LIMIT 0,10 Стоит key (area,phone_preff,age,timeregistered) Поля - area - ENUM(1,2,3,....) phone_preff - smallint(3), age - smallint(3), timeregistered - int(10) Проблема в том, что при запросе с age BETWEEN ... Mysql не использует ключ и в результате - при запросе EXPLAIN - using where, using filesort Тогда как при изменении условия age BETWEEN x AND y на age=x все нормализуется и filesort исчезает, остается только using where При интенсивной работе базы нагрузка очень хорошо ощущается, пытался обойти каким либо образом, ни чего не помогает - вот варианты, вместо BETWEEN x AND y - age IN ('x','x1','x2',...) еще обычный - age > x and age<y Все равно - filesort! а так же пытался использовать UNION -
Однако при большом возрастном диапозоне этот запрос еще тяжелее предыдущихб хотя и не использует filesort Есть какое то более интересное и быстрое решение, оптимизировать запрос? |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
если бы ты сбросил структуру и маленький(на 8-10 строк - можно прикрепить файлом к сообщению) дамп таблицы, можно было бы проэкспериментировать и быстрее найти решение. А касательно UNION - так у тебя запрос перед выдачей результата делает поиск, чтоб не было одинаковых строк. Если такого быть наверняка не может, то делай UNION ALL. впрочем, всё равно будет медленно, просто имей в виду на будущее.
|
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: 15 Всего: 54 |
Точно... Давай дамп... на 5-ке поэкспериментирую...
-------------------- ![]() |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
А ты не пробовал явно указать что использовать при выполнении запроса? USE INDEX/IGNORE INDEX
И еще:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| shurale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.8.2006 Где: Израиль Репутация: нет Всего: нет |
Спасибо всем за ответы.
Akina, да, пробовал использовать USE INDEX(search) когда search - (area,phone_preff,age,timeregistered) Не помогает! Kesh, skyboy, Спасибо за совет с UNION ALL. Вот кусок таблицы со структурой -
Интересно, если можно придумать обходной путь для выборки по возрасту.... , да - хостинг не позволяет использовать 5 мускул Добавлено @ 11:11 Akina, пробовал завести отдельный индекс по возрасту - ноль результата - не используется |
|||
|
||||
| shurale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.8.2006 Где: Израиль Репутация: нет Всего: нет |
Походу дела решение нашлось -
Создаем доп. ключ area (area,phone_preff,timeregistered) И при запросе
Уже не используется filesort !! Но почему, убирая age из идекса мы получаем лучший результат, хотя по логике все должно быть наоборот? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Не, если завести и сказать USE INDEX age - все одно filesearch?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| shurale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.8.2006 Где: Израиль Репутация: нет Всего: нет |
Akina, да, все одно, не использует...
|
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
офтопик: читая эту тему проабгрейдил один из своих скриптов. Спасибо!
|
|||
|
||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Вам дали почти правильный совет по поводу использования конструкции USE INDEX. Но USE носит рекомендательный характер для mysql. Есть более "сильный" вариант: FORCE INDEX () (работает с 4.0.9 версии), mysql будет использовать данный в скобках индекс, если это возможно для выполнения запроса.
А по поводу того, почему игнорируется индекс при задании рэнджа для age: При выборе способа отработки селект-запроса MySQL решает, целеобразно ли ему использовать какой-либо индекс. По моим наблюдениям, отрицательное решение принимается в случае, когда кол-во результирующих строк будет больше десятка процентов от кол-ва записей в индексе. Т.е. в вашем случае для age индекс используется только тогда, когда ему задают конкретное значение (скорее всего, если написать age between 25 and 26, индекс всё-таки тоже будет использоваться, т.к. такой рэндж охватывает относительно малое кол-во строк). Почему MySQL не решает использовать только первую часть индекса - загадка природы разработчиков этой БД Это сообщение отредактировал(а) muzer - 31.8.2006, 21:26 |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
По моим наблюдениям, мускуль использует либо индекс целиком, либо вообще не использует. Кстати, у меня была подобная проблема, но наличие filesort'а там было критично ( ndbcluster не дружит с оным ), посему было решено забить на сортировку и сделать её на клиенте.
За это спасибо -------------------- Теперь при чем :P |
|||
|
||||
| muzer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Нет, ну почему же, левую часть индекса он умеет использовать:
Обратите внимание на key_len, в первом случае весь индекс (2 инта), во втором - только левая часть. |
||||
|
|||||
| S.A.P. |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: нет Всего: 71 |
shurale, попробуй еще вот такой запрос
возможно мускул пытается отсортировать сначала всю таблицу, а потом сделать WHERE, потом LIMIT. Это сообщение отредактировал(а) S.A.P. - 3.9.2006, 14:55 |
|||
|
||||
| shurale |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 31.8.2006 Где: Израиль Репутация: нет Всего: нет |
Интересное решение, не могу его только опробовать - что то в синтаксисе, какая то ошибка, а я не очень силен в синтаксисе вложенных запросов. Но мысль интерсна - сократить диапозон, и по нему уже делать сортировку.
|
|||
|
||||
| Ignat |
|
||||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Нет, это он не может делать...
Действительно еще одна загадка Использовать или не использовать выбираеся оптимизатором по среднепотолочной системе? -------------------- Теперь при чем :P |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |