Classe SDA 7 2025-2026
Écrire une requête qui fonctionne est la première étape. Écrire une requête qui reste rapide même quand vos tables contiennent des millions de lignes est une compétence professionnelle essentielle. Une requête lente peut paralyser une application entière.
Vous lisez le livre page par page, du début à la fin, pour trouver ce que vous cherchez. C'est un Full Table Scan.
Vous utilisez l'index à la fin du livre pour aller directement à la bonne page. C'est beaucoup plus rapide.
Un index est une structure de données spéciale, séparée de la table, qui contient une copie triée d'une ou plusieurs colonnes avec des "pointeurs" vers les lignes correspondantes de la table.
| Type d'Index | Description | Usage |
|---|---|---|
| Index simple | Index sur une seule colonne | Recherches sur une colonne spécifique |
| Index composite | Index sur plusieurs colonnes | Recherches combinant plusieurs critères |
| Index unique | Garantit l'unicité des valeurs | Clés primaires, emails, numéros uniques |
| Index full-text | Pour la recherche textuelle | Recherche dans du contenu texte long |
Les index ne sont pas gratuits.
Ils accélèrent considérablement les opérations de lecture (SELECT, JOIN).
Ils ralentissent légèrement les opérations d'écriture (INSERT, UPDATE, DELETE), car la base de données doit mettre à jour à la fois la table ET l'index.
Créez des index sur les colonnes que vous utilisez fréquemment dans vos clauses WHERE et ON (les clés étrangères sont d'excellents candidats).
Comment savoir si votre requête utilise un index ? Comment savoir si elle est efficace ? En demandant au SGBD son plan d'exécution.
C'est comme demander à votre GPS de vous montrer l'itinéraire détaillé avant de commencer le trajet. Vous pouvez voir s'il prévoit de prendre l'autoroute (un index) ou de passer par des petites routes de campagne (un full scan).
La commande EXPLAIN (ou EXPLAIN ANALYZE sur PostgreSQL) est l'outil de débogage le plus important pour un développeur SQL.
| Colonne | Signification | Valeurs importantes |
|---|---|---|
| type | Type d'accès à la table | ALL = Full scan (⚠️ mauvais) index, ref, range = Index utilisé (✅ bon) |
| key | Index utilisé | Nom de l'index ou NULL si aucun |
| rows | Nombre de lignes examinées | Plus c'est bas, mieux c'est |
| Extra | Informations supplémentaires | Using index = très bon Using filesort = attention performance |
Force la base à récupérer toutes les colonnes, même inutiles.
Ne récupère que les colonnes nécessaires.
Appliquer une fonction sur une colonne dans une clause WHERE empêche souvent l'utilisation d'un index sur cette colonne.
L'index sur date_commande ne peut pas être utilisé.
L'index peut être utilisé efficacement.
Compte toutes les lignes.
S'arrête dès la première ligne trouvée.
Une transaction est un groupe d'une ou plusieurs opérations SQL qui doivent être traitées comme une seule unité de travail atomique.
Un virement de 100€ du compte A au compte B est composé de deux opérations :
Que se passe-t-il si le système plante après l'opération 1 mais avant l'opération 2 ? L'argent a disparu ! Une transaction garantit que soit les deux opérations réussissent, soit aucune n'est appliquée.
Les transactions garantissent quatre propriétés fondamentales, connues sous l'acronyme ACID :
Tout ou rien. Soit toutes les opérations de la transaction réussissent, soit aucune n'est appliquée.
La base de données passe d'un état cohérent à un autre état cohérent. Les contraintes sont respectées.
Les transactions concurrentes ne s'interfèrent pas. Chaque transaction s'exécute comme si elle était seule.
Une fois validée (COMMIT), la transaction est permanente, même en cas de panne système.
Les transactions trop longues peuvent bloquer d'autres utilisateurs et dégrader les performances. Gardez vos transactions courtes et précises.
Créez un index approprié pour accélérer cette requête :
Question : Sur quelle colonne faut-il créer l'index ?
Utilisez EXPLAIN pour analyser cette requête et identifiez les problèmes potentiels :
Question : Utilise-t-elle un index ou fait-elle un full scan ?
Réécrivez cette requête pour la rendre "sargable" :
Indice : Utilisez une comparaison de plage de dates au lieu d'une fonction.