Aller au contenu principal
Optimisation des requêtes SQL : Indexation et plans d'exécution
Retour aux articles

Optimisation des requêtes SQL : Indexation et plans d'exécution

Learn'in 1 min de lecture

Introduction

Les performances d'une application dépendent souvent de l'efficacité de ses requêtes SQL. Une requête mal optimisée peut ralentir considérablement votre système, surtout lorsque le volume de données augmente. Dans cet article, nous explorons deux leviers essentiels pour améliorer les performances : l'indexation et l'analyse des plans d'exécution.

Comprendre l'indexation

Qu'est-ce qu'un index ?

Un index est une structure de données qui permet d'accélérer les opérations de recherche dans une table. Imaginez un index comme la table des matières d'un livre : au lieu de parcourir toutes les pages, vous consultez directement la section qui vous intéresse.

Types d'index courants

sql
-- Index simple sur une colonne
CREATE INDEX idx_users_email ON users(email);

-- Index composite sur plusieurs colonnes
CREATE INDEX idx_orders_date_status ON orders(order_date, status);

-- Index unique (empêche les doublons)
CREATE UNIQUE INDEX idx_users_username ON users(username);

Quand créer un index ?

SituationRecommandation
Colonnes fréquemment utilisées dans WHEREOui
Colonnes utilisées dans JOINOui
Colonnes avec peu de valeurs distinctesNon
Tables très petitesNon nécessaire
Colonnes fréquemment mises à jourAttention (coût d'écriture)

Analyser les plans d'exécution

Qu'est-ce qu'un plan d'exécution ?

Un plan d'exécution décrit comment le moteur de base de données va exécuter votre requête. Il révèle les opérations effectuées (scan, seek, join) et leur coût estimé.

Exemple avec PostgreSQL

sql
-- Activer l'analyse détaillée
EXPLAIN ANALYZE
SELECT * FROM users WHERE email = 'test@example.com';

Sortie typique :

text
Index Scan using idx_users_email on users  (cost=0.42..8.44 rows=1 width=32)
  Actual time=0.035..0.037 rows=1 loops=1
  Index Cond: (email = 'test@example.com')
Planning Time: 0.150 ms
Execution Time: 0.052 ms

Interpréter les résultats

  • Index Scan : L'index est utilisé (bon signe)
  • Seq Scan : Parcours séquentiel de la table (à éviter sur les grandes tables)
  • Actual time : Temps réel d'exécution en millisecondes
  • rows : Nombre de lignes retournées

Bonnes pratiques d'optimisation

1. Éviter SELECT *

sql
-- Mauvaise pratique
SELECT * FROM users;

-- Bonne pratique
SELECT id, email, username FROM users;

2. Utiliser les jointures appropriées

sql
-- Privilégier les JOIN explicites
SELECT u.username, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.status = 'completed';

3. Limiter les résultats

sql
-- Utiliser LIMIT pour les grandes tables
SELECT * FROM logs ORDER BY created_at DESC LIMIT 100;

4. Surveiller les requêtes lentes

Activez le slow query log dans votre SGBD pour identifier les requêtes problématiques :

sql
-- PostgreSQL : requêtes > 1 seconde
SET log_min_duration_statement = 1000;

Outils recommandés

  • pg_stat_statements (PostgreSQL) : Suivi des statistiques de requêtes
  • MySQL Slow Query Log : Journal des requêtes lentes
  • EXPLAIN VISUAL : Visualisation graphique des plans d'exécution
  • Query Profiler : Outils intégrés aux IDE de développement

Conclusion

L'optimisation SQL est un processus itératif. Commencez par identifier les requêtes lentes, analysez leurs plans d'exécution, puis ajoutez des index stratégiques. Surveillez régulièrement les performances et ajustez votre stratégie selon l'évolution de vos données.

Articles similaires