Pourquoi indexer ?
Une requête sur un champ non indexé oblige MongoDB à examiner chaque document. Sur des milliers de documents, c'est lent. Un index sur ce champ permet de retrouver directement les bons documents.
_id.Créer un index
createIndex() crée un index sur un ou plusieurs champs (1 croissant, -1 décroissant).
db.campagnes.createIndex({ statut: 1 })
db.campagnes.getIndexes() // lister les index
db.campagnes.dropIndex("statut_1") // supprimer
Mesurer avec explain()
explain("executionStats") montre comment MongoDB exécute une requête : a-t-il utilisé un index (IXSCAN) ou parcouru toute la collection (COLLSCAN) ?
db.campagnes.find({ statut: "OUVERTE" }).explain("executionStats")
explain(). Voir COLLSCAN sur une grande collection = il manque probablement un index.Index composés
Un index sur plusieurs champs sert les requêtes qui filtrent sur ces champs. L'ordre compte : l'index {zone:1, statut:1} sert « zone » et « zone + statut », mais pas « statut » seul.
db.campagnes.createIndex({ zone: 1, statut: 1 })
Index unique, TTL, partiels
- Unique — interdit les doublons sur un champ (ex. l'e-mail d'un utilisateur).
- TTL (Time To Live) — supprime automatiquement les documents après un délai (ex. des jetons temporaires).
- Partiel — n'indexe qu'un sous-ensemble (ex. seulement les campagnes ouvertes).
db.utilisateurs.createIndex({ email: 1 }, { unique: true })
db.jetons.createIndex({ creeLe: 1 }, { expireAfterSeconds: 3600 })
db.campagnes.createIndex(
{ zone: 1 },
{ partialFilterExpression: { statut: "OUVERTE" } }
)
Le coût d'un index
Un index accélère les lectures mais ralentit un peu les écritures (il faut le tenir à jour) et occupe de l'espace. On indexe donc les champs réellement interrogés/triés, pas tous les champs.
Crée un index composé { statut: 1, zone: 1 } pour l'écran « campagnes ouvertes d'une zone », et un index unique sur email dans utilisateurs. Vérifie avec explain() que ta requête de liste passe bien en IXSCAN. Au chapitre 13, on ajoutera un index géospatial 2dsphere.
- Un index évite le parcours complet (
COLLSCAN→IXSCAN). createIndex(); on mesure avecexplain("executionStats").- Index composés : l'ordre compte (règle ESR).
- Variantes : unique, TTL, partiel. Un index a un coût en écriture/espace.