MySQL: не используется индекс для ORDER BY?
Я пытался все погуглить и до сих пор не могу понять, что происходит.
У меня есть большая таблица (100M+ строк). Среди прочего он имеет 3 столбца: user_id, date, type. Имеет индекс idx(user_id, type, date)
,
Когда я EXPLAIN
этот запрос:
SELECT *
FROM table
WHERE user_id = 12345
AND type = 'X'
ORDER BY date DESC
LIMIT 5
EXPLAIN показывает, что MySQL проверял 110K строк. это примерно ряд строк этого user_id.
Мой вопрос:
Почему тот же индекс не используется для ORDER_BY LIMIT 5
? Он знает, какие строки принадлежат user_id, дата является частью того же индекса, так почему бы просто не взять последние 5 строк в этом индексе?
PS Я попробовал индекс по (user_id, date, type) - те же результаты; я попытался удалить DESC - те же результаты.
Это EXPLAIN
план:
id: 1
select_type: SIMPLE
table: s
type: ref
possible_keys: dateIdx,userTypeDateIdx
key: userTypeDateIdx
key_len: 5
ref: const,const
rows: 110118
Extra: Using where
Я также попытался добавить FORCE INDEX FOR ORDER BY
намек, но я все еще получаю rows: 110118
,
2 ответа
Дата в индексе находится в порядке возрастания, и вы запрашиваете последние пять строк в порядке убывания по дате; он не может использовать индекс для этого. Если вы изменили индекс на user_id, type, date desc
он мог бы использовать индекс, чтобы получить последние пять строк.
Вы анализировали таблицу после создания индекса?
Mysql не будет использовать индекс, пока таблица не будет проанализирована. Лучший индекс для использования - тот, который вы создали (user_id, type, date)