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)

Другие вопросы по тегам