Index : Structure de données qui améliore la vitesse de recherche dans une table en créant un pointeur vers les lignes.
- Identifier les colonnes fréquemment utilisées dans WHERE
- Créer un index sur ces colonnes
- Tester la performance avant et après
- Surveiller l'impact sur les INSERT/UPDATE
La colonne nom est fréquemment utilisée dans les clauses WHERE
On exécute CREATE INDEX idx_clients_nom ON clients(nom)
La recherche est maintenant beaucoup plus rapide (O(log n) au lieu de O(n))
| Sans index | Avec index |
|---|---|
| Scan complet de la table | Accès direct via index |
| O(n) | O(log n) |
| 100ms pour 10000 lignes | 1ms pour 10000 lignes |
Index créé pour optimiser les recherches sur la colonne nom
• Choix judicieux : Ne créer des index que sur les colonnes fréquemment interrogées
• Coût en écriture : Les index ralentissent les INSERT/UPDATE/DELETE
• Stockage : Les index consomment de l'espace disque supplémentaire
Jointure optimisée : Utilisation de JOIN avec index sur les colonnes de liaison pour améliorer la performance.
La jointure se fait sur c.id_client = cmd.id_client
On crée des index sur les colonnes de liaison : clients.id_client et commandes.id_client
On remplace la jointure implicite par une jointure explicite avec JOIN
| Jointure implicite | Jointure explicite |
|---|---|
| FROM t1, t2 WHERE t1.c = t2.c | FROM t1 JOIN t2 ON t1.c = t2.c |
| Moins clair | Plus lisible |
| Moins optimisable | Plus optimisable |
Jointure optimisée avec syntaxe explicite et index appropriés
• Syntaxe JOIN : Utiliser la syntaxe explicite JOIN plutôt que la jointure implicite
• Index sur clés étrangères : Créer des index sur les colonnes utilisées dans les jointures
• Ordre des tables : Placer les tables les plus restrictives en premier
Sous-requête vs Jointure : Certaines sous-requêtes peuvent être remplacées par des jointures pour de meilleures performances.
La sous-requête IN peut souvent être remplacée par une jointure
On convertit WHERE id_client IN (sous-requête) en JOIN
On ajoute DISTINCT pour éviter les doublons
| Sous-requête | Jointure |
|---|---|
| Exécutée pour chaque ligne | Une seule passe |
| O(n*m) | O(n+m) avec index |
| 100ms | 10ms |
Sous-requête remplacée par une jointure plus performante
• Remplacement IN : Les sous-requêtes avec IN peuvent souvent être remplacées par des jointures
• Performance : Les jointures sont généralement plus rapides que les sous-requêtes
• Distinction : Utiliser DISTINCT si nécessaire pour éviter les doublons
Plan d'exécution : Description de la manière dont le SGBD va exécuter une requête, utile pour identifier les goulets d'étranglement.
On ajoute EXPLAIN QUERY PLAN devant la requête
On identifie les opérations de SCAN (lent) et SEARCH (rapide)
On crée des index là où des SCAN sont effectués
| Opération | Description | Performance |
|---|---|---|
| SCAN TABLE | Parcours complet de la table | O(n) |
| SEARCH TABLE | Recherche via index | O(log n) |
| SEARCH INDEX | Recherche via index secondaire | O(log n) |
Plan d'exécution analysé et optimisé
• EXPLAIN : Outil essentiel pour analyser la performance des requêtes
• SCAN vs SEARCH : Privilégier les opérations SEARCH aux SCAN
• Indexation : Créer des index sur les colonnes fréquemment recherchées
Optimisation GROUP BY : Techniques pour améliorer la performance des requêtes avec regroupement et fonctions d'agrégation.
La requête effectue un GROUP BY sur la colonne ville
On crée des index sur les colonnes de regroupement et de jointure
On place les filtres dans WHERE pour réduire le jeu de données avant GROUP BY
| Avant optimisation | Après optimisation |
|---|---|
| 100000 lignes traitées | 10000 lignes traitées |
| GROUP BY sur 100000 | GROUP BY sur 10000 |
| 200ms | 20ms |
Requête GROUP BY optimisée avec index et filtres appropriés
• Index sur GROUP BY : Créer des index sur les colonnes de regroupement
• Filtre avant : Utiliser WHERE pour réduire le jeu de données avant GROUP BY
• Complexité : Le GROUP BY est coûteux, l'optimiser est crucial
- Identification : Repérer les requêtes lentes dans les logs
- Analyse : Utiliser EXPLAIN pour comprendre le plan d'exécution
- Indexation : Créer des index sur les colonnes fréquemment utilisées
- Réécriture : Transformer les sous-requêtes en jointures
- Test : Comparer les performances avant et après
- Les index améliorent la lecture mais ralentissent l'écriture
- Les jointures sont généralement plus rapides que les sous-requêtes
- Les filtres dans WHERE sont plus efficaces que dans HAVING
- Le GROUP BY est une opération coûteuse, à utiliser avec parcimonie