PerformancePerformance · 29 juillet 2026 · 9 min de lecture· July 29, 2026 · 9 min read

Comprendre les index SQL : comment ils accélèrent (ou ralentissent) vos requêtes

Understanding SQL Indexes: How They Speed Up (or Slow Down) Your Queries

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.

A SQL index is a bit like a book's index: instead of reading every page to find a word, you consult a sorted structure that points directly to the right spot. Used well, an index turns a multi-second query into a few milliseconds. Used poorly, it slows down writes and wastes disk space.

Sans index : le scan complet

Without an Index: The Full Scan

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.

Without an index, the SQL engine must read every row in the table to find those matching your condition. This is called a full table scan. On a table with 10 million rows, looking up a single row by its identifier becomes very costly.

-- Sans index sur "email", cette requête lit toute la table
SELECT * FROM utilisateurs WHERE email = 'julie@exemple.com';
-- Without an index on "email", this query reads the entire table
SELECT * FROM users WHERE email = 'julie@example.com';

Avec index : la structure B-Tree

With an Index: The B-Tree Structure

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.

Most engines (PostgreSQL, MySQL/InnoDB, SQL Server) use a balanced tree structure called a B-Tree by default. Indexed values are sorted, which allows a row to be located in a logarithmic number of steps rather than a linear one.

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';
CREATE INDEX idx_users_email ON users (email);

-- The same query becomes much faster
SELECT * FROM users WHERE email = 'julie@example.com';

Avec cet index, le moteur retrouve la ligne en quelques comparaisons au lieu de parcourir toute la table.

With this index, the engine finds the row in just a few comparisons instead of scanning the entire table.

Quand créer un index

When to Create an 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
  • Columns frequently used in WHERE clauses
  • Columns used in join conditions (ON)
  • Columns used to sort results (ORDER BY)
  • Foreign keys, which are almost always queried

Quand éviter un index

When to Avoid an 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.

An index isn't free: every INSERT, UPDATE, or DELETE must also update all affected indexes. On a heavily written, rarely read table, too many indexes can significantly slow down writes.

Astuce : évitez d'indexer des colonnes à faible cardinalité (par exemple une colonne booleen actif avec seulement deux valeurs possibles) : le gain est souvent minime, voire négatif. Tip: avoid indexing low-cardinality columns (for example, a boolean active column with only two possible values): the gain is often minimal, or even negative.

Index composites

Composite Indexes

Quand une requête filtre sur plusieurs colonnes à la fois, un index composite (multi-colonnes) est souvent plus efficace qu'un index par colonne.

When a query filters on several columns at once, a composite (multi-column) index is often more efficient than one index per column.

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';
CREATE INDEX idx_orders_customer_date
ON orders (customer_id, order_date);

SELECT * FROM orders
WHERE customer_id = 42 AND order_date >= '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.

Column order matters: this index is very effective for filtering by customer_id alone or by customer_id + order_date, but not very useful for filtering by order_date alone.

Vérifier qu'un index est utilisé

Checking That an Index Is Used

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.

Use EXPLAIN (or EXPLAIN ANALYZE) to see the execution plan chosen by the engine and confirm it's actually using the expected index rather than a full scan.

EXPLAIN ANALYZE
SELECT * FROM utilisateurs WHERE email = 'julie@exemple.com';
EXPLAIN ANALYZE
SELECT * FROM users WHERE email = 'julie@example.com';
← Article précédent : Les jointures SQL ← Previous article: SQL Joins Article suivant : Les sous-requêtes → Next article: Subqueries →
Publicité Advertisement