Як я можу визначити, чи використовується індекс для сортування в 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запит і побачити результат самостійно.

Він повинен мати запис для

  • можливі_ключі

Якщо цей стовпець NULL, відповідних індексів немає. У цьому випадку ви можете покращити ефективність свого запиту, вивчивши пункт WHERE, щоб перевірити, чи стосується він якогось стовпця або стовпців, які були б придатні для індексації.

і

  • Ключі

Стовпчик клавіш вказує ключ (індекс), яким MySQL фактично вирішив скористатися. Якщо MySQL вирішить використовувати один з можливих індексів ключів для пошуку рядків, цей індекс вказаний як ключове значення.

Для отримання додаткової інформації ви можете ознайомитися з цим Пояснити вихід та Пояснити приєднані_типи


Я розумію, моє запитання конкретно стосується пункту ЗАМОВЛЕННЯ ПО. Мій запит використовує вказаний індекс для обмеження повернутих рядків, але враховуючи продуктивність сорту, я здогадуюсь, що він не використовує його для пункту ORDER BY.
Кріс Купер

1
У деяких випадках MySQL може використовувати індекс для задоволення пропозиції ORDER BY, не роблячи зайвих сортування. Індекс також можна використовувати, навіть якщо ORDER BY точно не відповідає індексу, доки всі невикористані частини індексу та всі додаткові стовпці ORDER BY є константами у пункті WHERE. Наступні запити використовують індекс для вирішення частини ЗАМОВЛЕННЯ посилаються на цей dev.mysql.com/doc/refman/5.0/uk/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.