Lecon 10.3 · Temps de lecture : ~9 min
Cette lecon presente les outils d'analyse et d'optimisation des requetes SQL. Vous allez voir comment le SGBD lit votre code, ce qu'est un plan d'execution et comment detecter les zones lentes. Nous utiliserons EXPLAIN et interpreterons ses champs principaux. A la fin, vous pourrez diagnostiquer les causes de lenteur de facon professionnelle.
Dans la lecon precedente, nous avons vu les regles de base pour ecrire du SQL efficace. Mais si la requete reste lente, il faut analyser au lieu de supposer. A chaque execution, l'optimiseur du SGBD construit un plan.
Comprendre ce plan est la cle d'une optimisation avancee. Dans cette lecon, nous regardons la "cuisine interne" du serveur grace a l'outil principal : le plan d'execution.
Un plan d'execution est une suite d'etapes detaillees preparees par le SGBD pour executer une requete SQL. Il precise :
cost) de chaque operation.EXPLAINDans les principaux SGBD relationnels (MySQL, PostgreSQL, MariaDB), EXPLAIN est la commande de reference.
Ajoutez EXPLAIN au debut de la requete :
EXPLAIN
SELECT customer_id, first_name, last_name
FROM customer
WHERE active = 1;
Resultat : le SGBD retourne un tableau ou chaque ligne decrit une etape d'execution.
type ou access_type)Ce champ indique comment les lignes sont lues :
const / eq_ref : excellent.ref : tres bon.range : bon.index : moyen.ALL : risque de scan complet de table.key / possible_keys)On voit l'index choisi. Si key vaut NULL, aucun index adapte n'a ete retenu.
rows)C'est une estimation du volume de lignes a verifier. Plus c'est faible, plus l'execution est generalement rapide.
Supposons la requete suivante :
EXPLAIN
SELECT *
FROM payment
WHERE payment_date = '2005-05-25 11:30:37';
Si type affiche ALL et key affiche NULL, l'index sur la date est absent ou non utilise.
Direction de correction :
En general, on cree un index sur la colonne du WHERE. Nous verrons le design d'index dans la prochaine lecon, mais c'est EXPLAIN qui revele le besoin.
JOIN peut ameliorer le plan.DISTINCT ou ORDER BY inutiles peuvent bloquer de meilleures optimisations.Points cles a retenir de cette lecon :
EXPLAIN montre comment les donnees sont reellement lues.ALL (scan complet) sur les grandes tables.rows aide a estimer la charge de traitement.key est NULL, verifiez index et predicates SARGable.EXPLAIN si la requete semble deja rapide ?Parce qu'il permet de detecter des risques avant la croissance des donnees. Une requete correcte aujourd'hui peut devenir lente demain.
Sur de grandes tables, ALL est souvent un signal d'alerte, car il indique un scan complet.
rows est-il crucial ?rows estime le volume de travail attendu. De grandes valeurs indiquent souvent ou commencer l'optimisation.
C'est la strategie construite par l'optimiseur SGBD pour produire le resultat. On y voit l'ordre des operations, les methodes d'acces et les couts estimes.
Je commence par type/access_type, key/possible_keys et rows. Ensemble, ils donnent une vue rapide de l'utilisation des index et du cout probable.
Si key reste souvent NULL et que l'acces passe en scan, il faut reevaluer l'indexation des colonnes WHERE et JOIN.
Dans la prochaine lecon, nous passerons a l'outil le plus puissant d'acceleration : les index.