Examiner les plans MySQL EXPLAIN et les chemins d’accès

Collez un plan déjà obtenu de MySQL : FORMAT=JSON, un arbre EXPLAIN ANALYZE ou la table copiée de la console. La page liste le type d’accès, la clé retenue et les lignes estimées de chaque table, et signale les scans complets, les tables temporaires et les filesort. Rien n’est envoyé à une base et aucune instruction n’est exécutée.

Fonctionne localement dans votre navigateur
Tout est traité dans le navigateur ; rien n’est envoyé.
Sortie MySQL EXPLAINCollez un EXPLAIN FORMAT=JSON, un arbre EXPLAIN ANALYZE, un résultat séparé par des tabulations ou la table de la console MySQL.
Entrée JSON, table ou arbreLes estimations dépendent du contexte de productionAucune connexion à la base

Cette revue de plan est en lecture seule : aucune requête n’est exécutée et aucun SQL n’est envoyé à MySQL.

Lignes d’accès
Aucune ligne d’accès à afficher pour l’instant.

Lire un plan MySQL à partir d’une sortie EXPLAIN

Collez un plan déjà obtenu de MySQL : la sortie FORMAT=JSON, un arbre EXPLAIN ANALYZE ou la table de console du client mysql. La page liste chaque table trouvée avec son type d’accès, la clé retenue et les lignes estimées, et signale les scans complets de table, les tables temporaires et le filesort. Tout s’exécute dans le navigateur : aucune instruction n’est lancée et rien n’est envoyé à une base de données.

L’analyse lit les trois formes que MySQL imprime lui-même et n’invente aucun chiffre : quand le plan ne porte pas d’estimation de lignes, la colonne affiche — au lieu de 0. Les estimations viennent des statistiques du serveur : c’est l’hypothèse du planificateur, pas une mesure de la requête.

  1. Lancez EXPLAIN dans MySQL et copiez tout le résultat : EXPLAIN FORMAT=JSON pour le plan JSON, EXPLAIN ANALYZE ou EXPLAIN FORMAT=TREE pour l’arbre, ou la table EXPLAIN simple de la console.
  2. Collez-le dans le champ et cliquez sur Analyser localement. Charger un exemple remplit le champ avec un plan JSON à deux tables qui conserve une sous-requête dans l’objet table.
  3. Lisez d’abord les cinq compteurs : lignes d’accès, lignes estimées, scans complets, accès par clé et scans d’index.
  4. Parcourez les constats : accès ALL, scan d’index complet, table temporaire, filesort et résultats intermédiaires sont nommés avec la table concernée.
  5. Vérifiez dans le tableau la clé retenue et la colonne extra (clés possibles, mémoire tampon de jointure, condition attachée), puis cliquez sur Copier pour emporter le rapport dans un ticket avant de modifier un index.

Ce que l’analyse affiche — et ce qu’elle ne peut pas voir

Lignes, clés et signification des compteurs

Lignes d’accès compte les entrées de table que l’analyse a trouvées dans le plan, pas les lignes parcourues par la requête ; une entrée correspond à une ligne du tableau. Lignes estimées additionne les valeurs rows_examined_per_scan (ou rows) qu’elle peut lire et affiche — quand aucune entrée ne porte de nombre. Scans complets compte le type d’accès ALL, scans d’index compte INDEX, et accès par clé compte les entrées où une clé a réellement été retenue.

Le tableau garde la terminologie du plan : type d’accès, clé retenue, filtré, et une colonne extra qui nomme les clés possibles quand aucune n’a été choisie, la mémoire tampon de jointure ou la condition attachée. possible_keys est une liste de candidates, pas un index retenu : elle n’apparaît donc jamais dans la colonne de la clé retenue.

Sorties JSON, arbre et console

MySQL 8 place les sous-requêtes et les vues matérialisées dans l’objet table (attached_subqueries, materialized_from_subquery). L’analyse y descend : une table interne apparaît donc comme une ligne à part, et une auto-jointure qui scanne deux fois la même table est signalée deux fois au lieu d’être fusionnée.

La sortie en arbre d’EXPLAIN ANALYZE est lue ligne à ligne (Table scan, Index scan, Index range scan, Index lookup…), et lorsque l’arbre porte des lignes réelles la page les affiche à côté de l’estimation. La sortie console est lue en colonnes séparées par tabulations ou barres : la table du client mysql peut être collée telle quelle. Les plans de plus de 250 lignes d’accès sont coupés après la 250e et le rapport le signale.

Limites : un plan, un instant

La page ne peut pas se connecter à MySQL : elle n’exécute pas la requête, ne voit ni le schéma ni les statistiques, et ne peut pas dire si le serveur choisirait encore ce plan. Un plan pris sans ANALYZE ne contient que des estimations, et un plan d’une autre version de MySQL peut nommer des clés ou des types d’accès que cette page ne connaît pas.

Rien n’est conservé entre deux analyses : une nouvelle remplace les compteurs, les constats, le tableau et le rapport, et un texte qui n’est pas un plan EXPLAIN vide les panneaux au lieu de laisser un ancien rapport que Copier pourrait livrer. Le rapport reprend le format, les compteurs et chaque constat : les notes voyagent avec les chiffres.

Outils récents :