Comprendre les index SQL : comment ils accélèrent (ou ralentissent) vos requêtes
Un index SQL, c'est un peu comme l'index d'un livre : au lieu de lire toutes les pages pour trouver un mot, on consulte une structure triée qui pointe directement vers le bon endroit. Bien utilisé, un index transforme une requête de plusieurs secondes en quelques millisecondes. Mal utilisé, il ralentit les écritures et gaspille de l'espace disque.
Sans index : le scan complet
Sans index, le moteur SQL doit lire chaque ligne de la table pour trouver celles qui correspondent à votre condition. C'est ce qu'on appelle un full table scan. Sur une table de 10 millions de lignes, chercher une seule ligne par son identifiant devient très coûteux.
-- Sans index sur "email", cette requête lit toute la table
SELECT * FROM utilisateurs WHERE email = 'julie@exemple.com';
Avec index : la structure B-Tree
La plupart des moteurs (PostgreSQL, MySQL/InnoDB, SQL Server) utilisent par défaut une structure d'arbre équilibré appelée B-Tree. Les valeurs indexées sont triées, ce qui permet de localiser une ligne en un nombre d'étapes logarithmique plutôt que linéaire.
CREATE INDEX idx_utilisateurs_email ON utilisateurs (email);
-- La même requête devient beaucoup plus rapide
SELECT * FROM utilisateurs WHERE email = 'julie@exemple.com';
Avec cet index, le moteur retrouve la ligne en quelques comparaisons au lieu de parcourir toute la table.
Quand créer un index
- Colonnes utilisées fréquemment dans des clauses
WHERE - Colonnes utilisées dans des conditions de jointure (
ON) - Colonnes utilisées pour trier les résultats (
ORDER BY) - Clés étrangères, qui sont presque toujours interrogées
Quand éviter un index
Un index n'est pas gratuit : chaque INSERT, UPDATE ou DELETE doit aussi mettre à jour tous les index concernés. Sur une table très écrite et peu lue, trop d'index peuvent ralentir les écritures de façon significative.
booleen actif avec seulement deux valeurs possibles) : le gain est souvent minime, voire négatif.Index composites
Quand une requête filtre sur plusieurs colonnes à la fois, un index composite (multi-colonnes) est souvent plus efficace qu'un index par colonne.
CREATE INDEX idx_commandes_client_date
ON commandes (client_id, date_commande);
SELECT * FROM commandes
WHERE client_id = 42 AND date_commande >= '2026-01-01';
L'ordre des colonnes compte : cet index est très efficace pour filtrer par client_id seul ou par client_id + date_commande, mais peu utile pour filtrer uniquement par date_commande.
Vérifier qu'un index est utilisé
Utilisez EXPLAIN (ou EXPLAIN ANALYZE) pour voir le plan d'exécution choisi par le moteur et confirmer qu'il utilise bien l'index attendu plutôt qu'un scan complet.
EXPLAIN ANALYZE
SELECT * FROM utilisateurs WHERE email = 'julie@exemple.com';
