Qu'est-ce qu'un index ?
Sans index, retrouver une ligne oblige à parcourir toute la table (full scan). Un index est une structure ordonnée (arbre B-tree) qui localise directement les lignes. La clé primaire et les UNIQUE sont indexés d'office.
CREATE INDEX idx_commande_campagne ON commande(campagne_id); CREATE INDEX idx_campagne_commune_statut ON campagne(commune, statut); SHOW INDEX FROM commande;
WHERE, JOIN ... ON et ORDER BY fréquents. Un index composite (a, b) sert a seul ou a+b, pas b seul (règle du « préfixe gauche »).Lire un plan avec EXPLAIN
EXPLAIN montre comment MySQL compte exécuter une requête, sans la lancer.
EXPLAIN SELECT * FROM commande WHERE campagne_id = 1;
- type —
const/ref/rangesont bons ;ALL= parcours complet (index manquant). - key — l'index réellement utilisé (
NULL= aucun). - rows — estimation des lignes examinées (plus bas = mieux).
Le coût des index
Autres leviers : éviter SELECT * ; ne pas appliquer de fonction sur une colonne indexée (WHERE YEAR(d)=2026 casse l'index — préférez d >= '2026-01-01' AND d < '2027-01-01') ; paginer par bornes plutôt qu'un gros OFFSET ; viser un index couvrant pour les requêtes critiques.
L'écran « campagnes ouvertes de ma commune, triées par prix » tourne des milliers de fois : un index campagne(commune, statut, prix_litre) filtre et fournit les lignes déjà triées, évitant à la fois le parcours complet et le tri en mémoire. Idem sur commande(campagne_id) pour l'agrégation du volume.
- Un index (B-tree) évite le parcours complet des tables.
- Indexer les colonnes des WHERE/JOIN/ORDER BY fréquents (préfixe gauche).
- EXPLAIN révèle l'index utilisé et le nombre de lignes examinées.
- Trop d'index pénalise les écritures : mesurer, garder l'utile.