Удаление 'использование файловой сортировки' из запроса - PullRequest
1 голос
/ 02 декабря 2011

У меня следующий запрос:

SELECT    *
FROM      shop_user_member_spots
WHERE     delete_flag = 0
ORDER BY  date_spotted desc
LIMIT     10

При запуске это занимает несколько минут.Таблица содержит около 2,5 миллионов строк.

Вот таблица (не разработана мной, но я могу внести некоторые изменения):

database table

И, наконец,, вот индексы (опять же, не сделанные мной!): indexes

Я пытался запустить этот запрос в течение нескольких часов, но безрезультатно.

Здесьвывод EXPLAIN: explain output

Любая помощь / статьи приветствуются.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Судя по вашему запросу, индекс, который вы хотели бы получить, будет (delete_flag, date_spotted). У вас есть индекс, который имеет два столбца, но между ними находится столбец id, что сделает индекс бесполезным при сортировке на основе date_spotted. Теперь не могу сказать, будет ли mysql использовать индекс, основанный на ответе Зохайба (извините, я чаще всего работаю с SQL Server).

0 голосов
/ 02 декабря 2011

Проблема, которую я вижу в плане объяснения, состоит в том, что индекс на определенную дату не используется, механизм сортировки файлов insted используется для сортировки (что касается индекса на флаге удаления, мы фактически получаем выигрыш в производительности от индекса если столбец, для которого создается индекс, содержит уникальные значения)

В документации MySQL написано

Индекс не будет использоваться для заказа по предложению, если

Ключ, используемый для извлечения строк, не совпадает с ключом, используемым в ORDER BY:

ВЫБРАТЬ * ОТ t1 ГДЕ key2 = постоянный ORDER BY key1;

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html Я думаю, то же самое и здесь. Хотя вы можете попробовать использовать Force Index

...