¿Cómo puedo saber si se está utilizando un índice para ordenar en MySQL?


10

Tengo una consulta con una cláusula ORDER BY que utiliza una columna que es la última columna de un índice que se utiliza en la cláusula WHERE, esencialmente de la forma:

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

y el índice se crea en columnas (col_1, col_2, col_3, col_4) en ese orden.

Cuando perfilo la consulta, más del 99% del tiempo se pasa en el estado "Resultado de la clasificación". col_4 es una columna de marca de tiempo si eso hace alguna diferencia. Entiendo que ORDER BY solo puede usar un índice bajo ciertas circunstancias, pero todavía estoy un poco desconcertado sobre cuándo exactamente lo haría el optimizador.

Respuestas:


13

Debe agregar EXPLAIN EXTENDEDantes de la consulta y ver el resultado usted mismo.

Debería tener una entrada para

  • posibles_claves

Si esta columna es NULL, no hay índices relevantes. En este caso, puede mejorar el rendimiento de su consulta examinando la cláusula WHERE para verificar si se refiere a alguna columna o columnas que serían adecuadas para la indexación.

y

  • Llaves

La columna clave indica la clave (índice) que MySQL realmente decidió usar. Si MySQL decide usar uno de los índices posible_keys para buscar filas, ese índice aparece como el valor clave.

Para obtener más información, puede consultar esta salida de Explain y Explain join_types


Entiendo, mi pregunta específicamente, tiene que ver con la cláusula ORDER BY. Mi consulta está usando el índice especificado para restringir las filas devueltas, pero dado el rendimiento del tipo, supongo que no lo está usando para la cláusula ORDER BY.
Chris Cooper

1
En algunos casos, MySQL puede usar un índice para satisfacer una cláusula ORDER BY sin realizar ninguna clasificación adicional. El índice también se puede usar incluso si ORDER BY no coincide exactamente con el índice, siempre que todas las partes no utilizadas del índice y todas las columnas ORDER BY adicionales sean constantes en la cláusula WHERE. Las siguientes consultas utilizan el índice para resolver la parte ORDER BY; consulte esta dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil

1

Usas EXPLAINen tu consulta ( explain select-or-whatever-your-query-is).

possible_keysmuestra los que podrían usarse, keyel que realmente se usó.


1
Para agregar a eso: explain format=json select ...es aún más poderoso. Incluye used_key_parts, que le indica si una clave compuesta se utilizó parcial o totalmente, y index_conditionle indica qué parte de la consulta es responsable de qué índice.
okdewit 05 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.