Comment savoir si un index est utilisé pour trier dans MySQL?

10

J'ai une requête avec une clause ORDER BY qui utilise une colonne qui est la dernière colonne d'un index utilisé dans la clause WHERE, essentiellement de la forme:

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

et l'index est créé sur les colonnes (col_1, col_2, col_3, col_4) dans cet ordre.

Lorsque je profile la requête, plus de 99% du temps est passé dans l'état "Résultat du tri". col_4 est une colonne d'horodatage si cela fait une différence. Je comprends que ORDER BY ne peut utiliser un index que dans certaines circonstances, mais je suis toujours un peu perplexe quant au moment précis où l'optimiseur le fera.

Chris Cooper
la source

Réponses:

13

Vous devez ajouter EXPLAIN EXTENDEDavant la requête et voir le résultat vous-même.

Il doit avoir une entrée pour

  • touches_ possibles

Si cette colonne est NULL, il n'y a pas d'index pertinents. Dans ce cas, vous pourrez peut-être améliorer les performances de votre requête en examinant la clause WHERE pour vérifier si elle fait référence à une ou plusieurs colonnes qui pourraient être indexées.

et

  • Clés

La colonne clé indique la clé (index) que MySQL a réellement décidé d'utiliser. Si MySQL décide d'utiliser l'un des index possible_keys pour rechercher des lignes, cet index est répertorié comme valeur de clé.

Pour plus d'informations, vous pouvez consulter cette sortie Explain et Explain join_types

Mahesh Patil
la source
Je comprends, ma question en particulier, concerne la clause ORDER BY. Ma requête utilise l'index spécifié pour restreindre les lignes retournées, mais étant donné les performances du tri, je suppose qu'il ne l'utilise pas pour la clause ORDER BY.
Chris Cooper
1
Dans certains cas, MySQL peut utiliser un index pour satisfaire une clause ORDER BY sans effectuer de tri supplémentaire. L'index peut également être utilisé même si ORDER BY ne correspond pas exactement à l'index, tant que toutes les parties inutilisées de l'index et toutes les colonnes ORDER BY supplémentaires sont des constantes dans la clause WHERE. Les requêtes suivantes utilisent l'index pour résoudre la partie ORDER BY référez ce dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
Mahesh Patil
1

Vous utilisez EXPLAINsur votre requête ( explain select-or-whatever-your-query-is).

possible_keysmontrer ceux qui pourraient être utilisés, keycelui qui est réellement utilisé.

sjas
la source
1
Pour ajouter à cela: explain format=json select ...est encore plus puissant. Il comprend used_key_parts, qui vous indique si une clé composite a été utilisée partiellement ou entièrement, et index_conditionvous indique quelle partie de la requête est responsable de quel index.
okdewit