Trois secondes de trop
Cycles Loire a grandi : la table des commandes compte maintenant deux millions de lignes. Au service client, chercher une commande par e-mail prend trois secondes. Pendant ce temps, le client attend au téléphone.
Un développeur ajoute une ligne de SQL. La même recherche devient instantanée. Cette ligne crée un index.
À la fin de cette leçon
Remarque
Je peux expliquer comment un index rend une requête plus rapide.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Parcours complet | lire toutes les lignes de la table, une par une | SCAN |
| Index | une liste triée qui mène directement aux bonnes lignes | |
| Plan de requête | la façon dont la base prévoit de répondre | |
| EXPLAIN QUERY PLAN | demande le plan sans lancer la requête | |
| Écriture | un ajout, une modification ou une suppression de ligne |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Sans index, la base lit tout
Vous cherchez la commande de [email protected]. La table n'est pas rangée par e-mail.
La base n'a donc qu'une solution : lire la première ligne, puis la deuxième, et ainsi de suite. C'est un parcours complet. Sur six lignes, personne ne le remarque. Sur deux millions de lignes, cela se sent à chaque recherche.
Un index est comme celui d'un livre
À la fin d'un manuel, l'index liste les mots dans l'ordre alphabétique, avec un numéro de page. Vous ne lisez pas tout le livre. Vous allez au mot, puis à la page.
Un index de base de données fait la même chose. Il range les e-mails dans l'ordre, chacun avec sa ligne. La base trouve l'e-mail en quelques étapes, puis va droit à la ligne.
Exemple détaillé : combien de lignes lues ?
| Lignes dans la table | Parcours complet, au pire | Avec un index, environ |
|---|---|---|
| 1 000 | 1 000 lignes | 10 étapes |
| 1 000 000 | 1 000 000 lignes | 20 étapes |
| 2 000 000 | 2 000 000 lignes | 21 étapes |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
EXPLAIN QUERY PLAN montre le chemin choisi
Vous pouvez demander à la base comment elle va répondre. Placez EXPLAIN QUERY PLAN devant la requête. Elle ne rend pas les commandes, elle décrit son plan.
SCAN veut dire parcours complet. SEARCH ... USING INDEX veut dire qu'elle passe par un index. Lancez les deux blocs suivants et comparez.
Essayez : le plan sans index
-- Comment la base va-t-elle chercher cette cliente ?
EXPLAIN QUERY PLAN
SELECT * FROM commandes WHERE email = '[email protected]';
-- Lisez la colonne detail : SCAN veut dire parcours complet.
Essayez : le plan avec un index
-- On crée un index sur la colonne email.
CREATE INDEX idx_commandes_email ON commandes(email);
-- Même question qu'avant.
EXPLAIN QUERY PLAN
SELECT * FROM commandes WHERE email = '[email protected]';
-- Le plan dit maintenant SEARCH ... USING INDEX.
Une erreur fréquente
Attention
Beaucoup pensent qu'il suffit d'indexer toutes les colonnes. C'est faux. Chaque index prend de la place, et chaque écriture doit le mettre à jour. Trop d'index ralentissent les ajouts de commandes. Indexez les colonnes que vous cherchez souvent dans un WHERE ou un JOIN.
À vous : indexer la ville
-- Le service commercial cherche souvent par ville.
EXPLAIN QUERY PLAN
SELECT * FROM commandes WHERE ville = 'Rennes';
-- Écrivez ici un CREATE INDEX pour la colonne ville,
-- puis copiez la requête EXPLAIN en dessous et relancez.