CREATE INDEX – Créer un index
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 6 minutes
En SQL, la commande CREATE INDEX permet de créer un index. L’index est utile pour accélérer l’exécution d’une requête SQL qui lit des données et ainsi améliorer les performances d’une application utilisant une base de données.
Bon à savoir : Les index peuvent être créés sur une ou plusieurs colonnes. Ils améliorent les performances des lectures mais ralentissent les écritures (
INSERT,UPDATE,DELETE). Il est donc important de les utiliser avec discernement.
Syntaxe
Section titled “Syntaxe”Créer un index ordinaire (simple)
Section titled “Créer un index ordinaire (simple)”La syntaxe basique pour créer un index est la suivante :
CREATE INDEX nom_index ON table (colonne);Créer un index sur plusieurs colonnes (index composite)
Section titled “Créer un index sur plusieurs colonnes (index composite)”Il est possible de créer un index sur plusieurs colonnes en les listant séparées par des virgules :
CREATE INDEX nom_index ON table (colonne1, colonne2);Créer un index unique
Section titled “Créer un index unique”Un index unique garantit que les valeurs de la colonne (ou des colonnes) sont uniques dans toute la table. Le SGBD retournera une erreur si une requête tente d’insérer une valeur en double.
CREATE UNIQUE INDEX nom_index ON table (colonne);Créer un index avec des options spécifiques
Section titled “Créer un index avec des options spécifiques”Certains SGBD permettent d’ajouter des options comme DESC (ordre descendant) ou des clauses WHERE (index partiel).
PostgreSQL (index partiel) :
CREATE INDEX idx_utilisateur_actif ON utilisateur (nom) WHERE actif = true;MySQL (index avec ordre descendant) :
CREATE INDEX idx_utilisateur_nom ON utilisateur (nom DESC);Créer un index ordinaire
Section titled “Créer un index ordinaire”Exemple 1 : Index simple sur une colonne
Section titled “Exemple 1 : Index simple sur une colonne”Supposons une table utilisateur avec une colonne email fréquemment utilisée dans les requêtes WHERE :
CREATE INDEX idx_utilisateur_email ON utilisateur (email);Exemple 2 : Index composite sur deux colonnes
Section titled “Exemple 2 : Index composite sur deux colonnes”Pour une table commande où les requêtes filtrent souvent par date_commande et client_id :
CREATE INDEX idx_commande_client_date ON commande (client_id, date_commande);Bon à savoir : L’ordre des colonnes dans un index composite est important. Il est généralement recommandé de placer en premier la colonne la plus sélective (celle qui a le plus de valeurs distinctes).
Créer un index unique
Section titled “Créer un index unique”Exemple 1 : Index unique sur une colonne
Section titled “Exemple 1 : Index unique sur une colonne”Pour garantir que chaque adresse email est unique :
CREATE UNIQUE INDEX idx_utilisateur_email_unique ON utilisateur (email);Cette commande empêche l’insertion de deux utilisateurs avec la même adresse email.
Exemple 2 : Index unique sur plusieurs colonnes
Section titled “Exemple 2 : Index unique sur plusieurs colonnes”Pour garantir qu’une combinaison de colonnes est unique (ex: un client ne peut pas avoir deux commandes avec le même numéro de commande) :
CREATE UNIQUE INDEX idx_commande_client_numero ON commande (client_id, numero_commande);Convention de nommage des index
Section titled “Convention de nommage des index”Il n’existe pas de convention de nommage officielle, mais voici des suggestions de préfixes utilisés par de nombreux développeurs et administrateurs de bases de données :
| Préfixe | Signification |
|---|---|
PK_ |
Primary Key (clé primaire) |
FK_ |
Foreign Key (clé étrangère) |
UK_ |
Unique Key (clé unique) |
UX_ |
Unique Index (index unique) |
IDX_ ou IX_ |
Index standard |
Exemples :
-- Index standardCREATE INDEX idx_utilisateur_email ON utilisateur (email);
-- Index uniqueCREATE UNIQUE INDEX uk_utilisateur_email ON utilisateur (email);
-- Index compositeCREATE INDEX idx_commande_client_date ON commande (client_id, date_commande);Exemple complet avec une table
Section titled “Exemple complet avec une table”Imaginons une table produit et une table commande dans une base de données e-commerce.
Table « produit » :
CREATE TABLE produit ( id INT PRIMARY KEY, nom VARCHAR(255), categorie VARCHAR(100), prix DECIMAL(10,2), stock INT, date_ajout DATE);Création d’index pour optimiser les requêtes :
-- Index pour les recherches par catégorieCREATE INDEX idx_produit_categorie ON produit (categorie);
-- Index pour les tris par prixCREATE INDEX idx_produit_prix ON produit (prix DESC);
-- Index composite pour les recherches par catégorie et prix (filtre + tri)CREATE INDEX idx_produit_categorie_prix ON produit (categorie, prix);
-- Index partiel (PostgreSQL) : seulement pour les produits en stockCREATE INDEX idx_produit_stock ON produit (stock) WHERE stock > 0;Requête optimisée par ces index :
-- Utilise idx_produit_categorie_prix (filtre sur categorie + tri sur prix)SELECT * FROM produit WHERE categorie = 'informatique' ORDER BY prix DESC;
-- Utilise idx_produit_stock (PostgreSQL) pour les produits en stockSELECT * FROM produit WHERE stock > 0;Vérifier les index existants
Section titled “Vérifier les index existants”MySQL / MariaDB
Section titled “MySQL / MariaDB”SHOW INDEX FROM nom_table;PostgreSQL
Section titled “PostgreSQL”SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'nom_table';SQL Server
Section titled “SQL Server”SELECT name, type_desc FROM sys.indexes WHERE object_id = OBJECT_ID('nom_table');Oracle
Section titled “Oracle”SELECT index_name, uniqueness FROM user_indexes WHERE table_name = 'NOM_TABLE';Supprimer un index
Section titled “Supprimer un index”MySQL / MariaDB
Section titled “MySQL / MariaDB”DROP INDEX nom_index ON nom_table;PostgreSQL
Section titled “PostgreSQL”DROP INDEX nom_index;SQL Server
Section titled “SQL Server”DROP INDEX nom_index ON nom_table;Compatibilité entre SGBD
Section titled “Compatibilité entre SGBD”| SGBD | CREATE INDEX | UNIQUE INDEX | Index composite | Index partiel |
|---|---|---|---|---|
| MySQL | Oui | Oui | Oui | Non |
| MariaDB | Oui | Oui | Oui | Non |
| PostgreSQL | Oui | Oui | Oui | Oui |
| SQL Server | Oui | Oui | Oui | Oui (filtre) |
| Oracle | Oui | Oui | Oui | Oui (filtre) |
| SQLite | Oui | Oui | Oui | Oui |
Bonnes pratiques
Section titled “Bonnes pratiques”-
Analysez vos requêtes avant de créer des index : utilisez
EXPLAINpour identifier les requêtes lentes (voir chapitre 45). -
Indexez les colonnes utilisées dans
WHERE,JOIN,ORDER BYetGROUP BY. -
Préférez les index composites lorsque les requêtes filtrent sur plusieurs colonnes.
-
Choisissez l’ordre des colonnes dans un index composite en fonction de la sélectivité : placez la colonne la plus sélective en premier.
-
Évitez les index sur les colonnes avec une faible sélectivité (ex: une colonne
sexeavec seulement 2 valeurs distinctes). -
Surveillez la performance des écritures : chaque index supplémentaire ralentit les
INSERT,UPDATEetDELETE. -
Utilisez des noms explicites pour vos index (incluez le nom de la table et les colonnes).
-
Testez en environnement de développement avant de créer des index en production.
Erreurs courantes
Section titled “Erreurs courantes”| Erreur | Cause | Solution |
|---|---|---|
Duplicate key name |
Index avec le même nom existe déjà | Utiliser un nom différent |
Duplicate entry (UNIQUE) |
Donnée en double dans la colonne | Supprimer les doublons avant de créer l’index unique |
Index column size too large |
Colonne trop grande pour l’index (MySQL) | Limiter la taille de l’index ou utiliser un préfixe |
Cannot create index on view |
Index sur une vue non supporté | Créer l’index sur la table sous-jacente |
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment créer des index pour optimiser vos requêtes. Mais comment savoir si vos index sont réellement utilisés et si vos requêtes sont efficaces ?
👉 Chapitre 45 : EXPLAIN – Analyser les requêtes
Bonne continuation !
Junior TSAFACK – 08/08/2026