Как я могу определить, используется ли индекс для сортировки в MySQL?


10

У меня есть запрос с предложением ORDER BY, который использует столбец, который является последним столбцом в индексе, который используется в предложении WHERE, по существу, в форме:

SELECT
  cols
FROM
  tables
WHERE
  col_1 = x
  AND col_2 = y
  AND col_3 = z
ORDER BY col_4

и индекс создается для столбцов (col_1, col_2, col_3, col_4) в указанном порядке.

При профилировании запроса более 99% времени уходит в состояние «Результат сортировки». col_4 - это столбец отметки времени, если это имеет значение. Я понимаю, что ORDER BY может использовать индекс только при определенных обстоятельствах, но я все еще немного озадачен тем, когда именно оптимизатор сделает это.

Ответы:


13

Вы должны добавить EXPLAIN EXTENDEDперед запросом и увидеть результат самостоятельно.

Должна быть запись для

  • possible_keys

Если этот столбец равен NULL, соответствующие индексы отсутствуют. В этом случае вы сможете улучшить производительность вашего запроса, изучив предложение WHERE, чтобы проверить, относится ли он к какому-либо столбцу или столбцам, подходящим для индексации.

и

  • Ключи

Столбец ключа указывает ключ (индекс), который MySQL фактически решил использовать. Если MySQL решит использовать один из индексов возможных_ключей для поиска строк, этот индекс будет указан в качестве значения ключа.

Для получения дополнительной информации вы можете обратиться к этим выходным данным Explain и Explain join_types


Я понимаю, мой вопрос, в частности, связан с предложением ORDER BY. Мой запрос использует указанный индекс, чтобы ограничить возвращаемые строки, но, учитывая производительность, я предполагаю, что он не использует его для предложения ORDER BY.
Крис Купер

1
В некоторых случаях MySQL может использовать индекс для удовлетворения предложения ORDER BY без какой-либо дополнительной сортировки. Индекс также можно использовать, даже если ORDER BY не соответствует индексу точно, если все неиспользуемые части индекса и все дополнительные столбцы ORDER BY являются константами в предложении WHERE. Следующие запросы используют индекс для разрешения части ORDER BY, ссылаясь на этот dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil

1

Вы используете EXPLAINпо вашему запросу ( explain select-or-whatever-your-query-is).

possible_keysпокажите те, которые можно использовать, keyте , которые на самом деле использовали.


1
Чтобы добавить к этому: explain format=json select ...еще более мощный. Он включает в себя информацию о used_key_partsтом, использовался ли составной ключ частично или полностью, а index_conditionтакже информацию о том, какая часть запроса отвечает за какой индекс.
okdewit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.