MySQL: не используется индекс для ORDER BY? - PullRequest
2 голосов
/ 07 июля 2011

Я пытался и все гуглил и до сих пор не могу понять, что происходит.

У меня большая таблица (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 ]

0 голосов
/ 07 июля 2011

Дата в индексе в порядке возрастания, и вы запрашиваете самые последние пять строк в порядке убывания по дате;он не может использовать индекс для этого.Если вы изменили индекс на user_id, type, date desc, он сможет использовать индекс для получения последних пяти строк.

0 голосов
/ 07 июля 2011

АНАЛИЗИЛИ ли Вы TABLE после создания индекса?

Mysql не будет использовать индекс, пока таблица не будет проанализирована.Лучший индекс для использования - тот, который вы создали (user_id, type, date)

...