Un index couvrant (ou covering index en anglais) est un type d'index dans une base de données relationnelle qui contient toutes les colonnes nécessaires pour répondre à une requête SQL, sans avoir besoin d'accéder aux données de la table sous-jacente. Cela signifie que l'index "couvre" entièrement la requête, ce qui améliore significativement les performances en évitant les accès coûteux aux données de la table.

Mécanisme et avantages

Fonctionnement :

Un index classique stocke généralement une ou quelques colonnes (souvent la clé primaire ou une clé étrangère) et pointe vers les lignes de la table.
Un index couvrant, en revanche, inclut toutes les colonnes référencées dans la requête (par exemple, dans les clauses SELECT, WHERE, JOIN, ORDER BY, ou GROUP BY).
Le moteur de la base de données peut ainsi satisfaire la requête uniquement en lisant l'index, sans accéder à la table elle-même. Cela réduit les opérations d'E/S (entrées/sorties) et accélère l'exécution.

Avantages :

Performance : Réduction du temps de réponse, car les données sont lues directement depuis l'index, souvent plus compact et optimisé pour la lecture.
Réduction des E/S : Moins d'accès aux pages de données de la table, ce qui est particulièrement utile pour les tables volumineuses.
Optimisation des jointures : Si l'index couvre les colonnes utilisées dans une jointure, celle-ci peut être résolue plus efficacement.

Exemple concret
Supposons une table commandes avec les colonnes suivantes :
id_commande (clé primaire)
id_client
date_commande
montant

Si vous exécutez fréquemment une requête comme :
SELECT id_commande, date_commande, montant
FROM commandes
WHERE id_client = 123;
Un index couvrant pourrait être créé sur (id_client, id_commande, date_commande, montant). Ainsi, la base de données n'aura pas besoin d'accéder à la table commandes pour récupérer les résultats.

Cas d'usage typiques
Requêtes fréquentes : Pour les requêtes exécutées souvent, un index couvrant peut réduire la charge sur le système.
Tables volumineuses : Quand les tables sont grandes et que les requêtes ne nécessitent qu'un sous-ensemble de colonnes.
Optimisation des jointures : Pour éviter les accès coûteux aux tables lors de jointures.

Limites et précautions

Coût de stockage :

Les index couvrant occupent plus d'espace disque que les index classiques, car ils dupliquent les données des colonnes incluses.

Maintenance :

Les mises à jour (INSERT, UPDATE, DELETE) sur les colonnes indexées peuvent être plus lentes, car l'index doit aussi être mis à jour.

Sélectivité :

Si l'index couvre trop de colonnes ou des colonnes peu sélectives (par exemple, un booléen), son efficacité peut diminuer.

Choix des colonnes :

Il est crucial d'inclure uniquement les colonnes nécessaires pour éviter un surcoût inutile. Les colonnes doivent être choisies en fonction des requêtes les plus critiques.

Comment créer un index couvrant ?
En SQL, un index couvrant est généralement créé comme un index composite incluant toutes les colonnes nécessaires. Par exemple :
CREATE INDEX idx_covering_commandes ON commandes (id_client, id_commande, date_commande, montant);

Vérification de l'utilisation d'un index couvrant
Dans la plupart des SGBD (comme PostgreSQL, MySQL, ou SQL Server), vous pouvez utiliser la commande EXPLAIN pour vérifier si une requête utilise un index couvrant. Par exemple :
EXPLAIN SELECT id_commande, date_commande, montant FROM commandes WHERE id_client = 123;
Si le plan d'exécution montre que la requête est satisfaite uniquement par l'index (par exemple, avec "Index Only Scan" dans PostgreSQL), alors l'index est couvrant.

Différence avec un index classique
Critère Index classique Index couvrant

Colonnes indexées Une ou quelques colonnes (souvent la clé). Toutes les colonnes nécessaires à la requête.
Accès aux données Nécessite un accès à la table pour les colonnes non indexées. Pas besoin d'accéder à la table.
Performance Moins optimisé pour les requêtes complexes. Très performant pour les requêtes ciblées.
Espace disque Moins gourmand. Plus gourmand (duplication des données).

En résumé : Un index couvrant est une technique d'optimisation puissante pour accélérer les requêtes fréquentes, mais son utilisation doit être soigneusement planifiée pour éviter un surcoût en stockage et en maintenance.