Aujourd’hui, on va parler d’un sujet qui peut littéralement transformer vos perfs en base de données : les INDEX en SQL.
Je dis ca parce que je viens de finir quelques sites avec de grosses bases à plusieurs millions de lignes.
C’est un truc qu’on oublie souvent au début, mais qui devient vital dès qu’on commence à manipuler des gros volumes de données. Genre plusieurs milliers, dizaines de milliers, ou carrément des millions de lignes.
Tu veux que tes requêtes SELECT
soient plus rapides que l’éclair ?
Tu veux pas que ton serveur MySQL te crie dessus à chaque jointure ?
Bah les index, c’est ta nouvelle meilleure arme ?️
C’est quoi un index SQL ?
Un index, c’est un peu comme la table des matières d’un bouquin.
Au lieu de lire toutes les pages pour trouver ce que tu veux (ce que fait une requête sans index), tu vas direct à la bonne page.
En gros, l’index te permet de retrouver une ou plusieurs lignes beaucoup plus rapidement en évitant de scanner toute la table.
Pourquoi utiliser des index ?
Voici les cas où un index te sauve la mise :
- Tu fais souvent des recherches avec
WHERE
- Tu fais des jointures (
JOIN
) entre des grosses tables - Tu ordonnes les résultats (
ORDER BY
) - Tu fais des recherches avec
LIKE 'abc%'
- Tu filtres avec
GROUP BY
- Tu veux que ton appli reste fluide même avec 2 millions de lignes
Exemple concret
Imagine une table utilisateurs
avec 2 millions d’entrées.
SELECT * FROM utilisateurs WHERE email = 'bob@example.com';
Sans index sur email
, MySQL va scanner chaque ligne une par une ?
Avec un index sur email
, MySQL saute direct à la bonne ligne ?
CREATE INDEX idx_email ON utilisateurs(email);
Et bam, requête optimisée ?
Index simple vs index composé
-
Index simple : un seul champ
CREATE INDEX idx_nom ON users(nom);
-
Index composé : plusieurs champs
CREATE INDEX idx_nom_prenom ON users(nom, prenom);
⚠️ L’ordre compte ! L’index (nom, prenom)
sera utilisé si tu filtres sur nom
ou nom
+ prenom
, pas juste sur prenom
.
Ce que les index ne font pas
- Ils n’accélèrent pas les
INSERT
/UPDATE
/DELETE
, au contraire, ils les ralentissent un peu - Ils prennent de la place (en fonction de la taille des colonnes indexées)
- Ils ne servent à rien si tes requêtes ne les utilisent pas
Bien utiliser les index : bonnes pratiques
-
Indexe ce que tu filtres souvent (
WHERE
,JOIN
,ORDER BY
) -
Évite d’indexer toutes les colonnes, c’est contre-productif
-
Ne pas indexer des colonnes avec peu de valeurs distinctes (genre
sexe
,actif
) -
LIKE 'abc%'
fonctionne avec un index.LIKE '%abc'
non. -
Utilise
EXPLAIN
pour vérifier que ton index est utilisé :EXPLAIN SELECT * FROM utilisateurs WHERE email = 'bob@example.com';
Nettoyage d’index
Supprime les index inutilisés :
DROP INDEX idx_email ON utilisateurs;
Et liste-les avec :
SHOW INDEX FROM utilisateurs;
En résumé
Avantages | Inconvénients |
---|---|
Requêtes SELECT beaucoup plus rapides |
INSERT , UPDATE , DELETE plus lents |
Indispensable sur les grosses bases | Utilise de l’espace disque |
Optimise JOIN , ORDER BY , GROUP BY |
Ne fonctionne pas avec %valeur |
Les index, c’est LE truc qui a changé ma vie de dev backend quand j’ai bossé avec des grosses bases clients.
Sans eux, je galérais avec des requêtes lentes. Avec eux, ça vole.
Pense index. Pense performance. Pense long terme.