Leçon 9 / 20

Lire les étapes d’un plan d’exécution

25 min SQL — modélisation, index et optimisation Gratuit

Objectif : Identifier dans un plan EXPLAIN les tables parcourues et l’ordre des opérations estimé par MariaDB.

Une requête peut être correcte tout en mobilisant beaucoup de lignes avant de produire son résultat. Pour comprendre où se situe ce travail, vous devez lire le plan d’exécution plutôt que déduire le comportement de la requête à partir de sa seule écriture. Dans cette leçon, vous examinez les accès aux tables et l’ordre de jointure estimé par MariaDB.

Vous avez déjà utilisé `EXPLAIN` pour vérifier la présence possible et l’usage effectif d’un index. Ici, vous élargissez la lecture du plan : repérez chaque table, le chemin d’accès choisi et la manière dont les résultats d’une table alimentent la suivante.

Observer un plan de jointure

Prenez une recherche d’emprunts pour un adhérent. La requête joint les tables `adherents` et `emprunts` à partir de l’identifiant de l’adhérent, puis trie les dates d’emprunt. Les alias rendent le plan et la requête plus faciles à rapprocher ; ils ne changent pas les données ni le résultat attendu.

SQL
-- Examiner l’ordre de jointure et le mode d’accès aux deux tables.
EXPLAIN
SELECT a.adherent_id, e.date_emprunt
FROM adherents AS a
JOIN emprunts AS e
    ON e.adherent_id = a.adherent_id
WHERE a.adherent_id = 42
ORDER BY e.date_emprunt;

Dans le résultat tabulaire, lisez les lignes correspondant aux tables impliquées. La colonne `table` indique la table traitée à cette étape ; `type` décrit le mode d’accès. L’ordre des lignes donne l’ordre de jointure estimé par l’optimiseur : il peut différer de l’ordre dans lequel vous avez écrit les tables dans `FROM` et `JOIN`.

Distinguer les modes d’accès

Le type `ALL` signale un parcours complet de la table concernée : MariaDB examine ses lignes pour trouver celles qui répondent à la requête. Ce mode n’est pas automatiquement mauvais. Sur une petite table, ou lorsque la requête doit lire une grande partie de ses lignes, parcourir la table peut coûter moins cher que consulter un index puis retrouver les lignes.

Le type `range` correspond à un accès par intervalle dans un index, par exemple pour une condition de plage ou certaines comparaisons. Le type `ref` indique une recherche à partir d’une valeur d’index qui peut correspondre à plusieurs lignes. Dans la requête d’exemple, l’index composite `idx_emprunts_adherent_date` peut fournir un accès `ref` aux emprunts correspondant à l’adhérent ; le type réellement choisi dépend des statistiques, des données et du coût estimé.

Lire la représentation JSON

Pour examiner la structure du plan, MariaDB 11 propose `EXPLAIN FORMAT=JSON`. La sortie est plus détaillée que le tableau habituel et représente les opérations de jointure sous forme imbriquée. Les noms de propriétés aident à retrouver la table, le mode d’accès et les estimations ; leur niveau d’imbrication rend visible la succession estimée des opérations.

SQL
-- Obtenir une représentation structurée du même plan.
EXPLAIN FORMAT=JSON
SELECT a.adherent_id, e.date_emprunt
FROM adherents AS a
JOIN emprunts AS e
    ON e.adherent_id = a.adherent_id
WHERE a.adherent_id = 42
ORDER BY e.date_emprunt;
Résultat attendu
MariaDB renvoie une colonne JSON contenant notamment les tables de la jointure, leur `access_type`, les index envisagés ou choisis et le nombre de lignes estimé. Le contenu exact dépend des données et de la version du serveur.

Dans cette sortie, cherchez les objets `table` et `access_type`, puis suivez les objets imbriqués de la jointure pour identifier l’ordre retenu. Comparez cet ordre au plan tabulaire et reliez chaque étape au rôle de la table dans la requête. `EXPLAIN FORMAT=JSON` décrit toujours un plan estimé ; ne le présentez pas comme une mesure chronométrée de l’exécution réelle.

Consigner le diagnostic

Ajoutez ces deux commandes à `sql/diagnostics.sql`, à la suite des vérifications déjà présentes. Conservez un commentaire qui décrit ce que vous avez effectivement observé sur votre base, plutôt qu’un résultat supposé : l’ordre et les modes d’accès peuvent changer avec les données ou les statistiques du serveur. Ce relevé vous servira de point de comparaison lorsque vous étudierez les prédicats et les requêtes elles-mêmes.

À retenir

  • La colonne `table` permet d’identifier les tables traitées ; l’ordre affiché dans le plan indique l’ordre de jointure estimé, pas nécessairement l’ordre écrit dans la requête.
  • `ALL` correspond à un parcours complet, `range` à un accès par intervalle et `ref` à une recherche indexée pouvant renvoyer plusieurs lignes.
  • Un mode d’accès ne suffit pas à juger les performances : interprétez-le avec le volume estimé et le contexte de la requête.
  • `EXPLAIN FORMAT=JSON` expose les étapes imbriquées du plan sous une forme structurée, mais reste une estimation.

Dans la prochaine leçon, vous examinerez pourquoi certains prédicats empêchent un accès efficace par index.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.