référence MySQL : http://dev.mysql.com/doc/refman/8.0/en/explain-output.html
Accès aux tables et aux index
La sortie de plan d'exécution de MySQL a tendance à donner une fausse impression de sécurité car elle donne beaucoup d'informations sur les index utilisés. Bien que cela soit techniquement correct, cela ne signifie pas que l'index soit efficacement utilisé. L'information la plus importante se situe dans la colonne TYPE
de la sortie de l'explain
de MySQL (mais même ici, le mot-clé INDEX
n'indique pas une indexation adéquate).
- eq_ref, const
Réalise un parcours du B-tree pour trouver une ligne (comme
INDEX UNIQUE SCAN
) et récupère les colonnes supplémentaires de la table si nécessaire (TABLE ACCESS BY INDEX ROWID
). La base de données utilise cette opération si une clé primaire ou une contrainte unique assure que le critère de recherche correspond à au plus une ligne. Voir “Utiliser un index” pour vérifier si l'accès à la table survient ou pas.- ref, range
Réalise un parcours du B-tree, suit la chaîne de nœuds feuilles pour trouver toutes les entrées correspondantes (similaire à un
INDEX RANGE SCAN
) et récupère les colonnes supplémentaires à partir de la table primaire si nécessaire (TABLE ACCESS BY INDEX ROWID
). Voir “Utiliser un index” pour vérifier si l'accès à la table survient ou pas.- index
Lit l'index entier (toutes les lignes) dans l'ordre de l'index (similaire à un
INDEX FULL SCAN
).- ALL
Lit la table entière, toutes les lignes et toutes les colonnes, comme elle est stockée sur disque. En dehors de forts taux d'entrées/sorties, un parcours de table doit également inspecter toutes les lignes de la table, et peut donc aussi consommer beaucoup de temps processeur. Voir aussi « Parcours complet de table ».
- Using Index (dans la colonne « Extra »)
Quand la colonne « Extra » affiche “Using Index”, cela signifie que la table n'est pas accédée car l'index dispose de toutes les données nécessaires. Pensez à “using index ONLY” (utilisation de l'index uniquement). Néanmoins, si un index trié est utilisé (par exemple l'index
PRIMARY
lors de l'utilisation d'InnoDB), “Using Index” n'apparaît pas dans la colonne Extra bien qu'il s'agisse techniquement d'un Index-Only Scan. Voir aussi « Regrouper les données : La deuxième puissance de l'indexation ».- PRIMARY (dans la colonne « key » ou « possible_keys »)
PRIMARY
est le nom de l'index automatiquement créé pour la clé primaire.
Tri et regroupement
- using filesort (dans la colonne « Extra »)
« using filesort » dans la colonne Extra indique une opération de tri explicite, sans se soucier de l'endroit où se fait le tri (en mémoire ou sur le disque). « Using filesort » a besoin d'une grande quantité de mémoire pour matérialiser le résultat intermédiaire (sans pipeline). Voir aussi « Indexer un tri ».
Requêtes Top-N
- Implicite (pas de « using filesort » dans la colonne « Extra »)
Un plan d'exécution MySQL ne montre pas une requête top-N de manière explicite. Si vous utilisez la syntaxe
limit
et ne voyez pas « using filesort » dans la colonne extra, c'est qu'elle est exécutée dans un pipeline. Voir aussi « Récupérer les N premières lignes ».