🛢️Parcours Fioul GroupéMongoDB · Chapitre 11
Accueil › MongoDB › Chapitre 11
Chapitre 11 / 17

Les index

Un index accélère les recherches, comme l'index d'un livre évite de le lire en entier. Sans index, MongoDB parcourt tous les documents (collection scan). Bien indexer, c'est la clé de la performance.

1 Notion

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.

Analogie — chercher « Ladignac » dans un annuaire non trié = tout lire ; avec un index alphabétique = aller droit au but. Chaque collection a déjà un index sur _id.
2 Méthode

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
3 Outil

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")
Le réflexe pro — devant une requête lente, on lance explain(). Voir COLLSCAN sur une grande collection = il manque probablement un index.
4 Notion

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 })
Règle « ESR » — dans un index composé, on place d'abord les champs d'Égalité, puis ceux de Sort (tri), puis ceux de Range (plage). Un bon moyen mnémotechnique pour ordonner les champs.
5 Notion

Index unique, TTL, partiels

db.utilisateurs.createIndex({ email: 1 }, { unique: true })

db.jetons.createIndex({ creeLe: 1 }, { expireAfterSeconds: 3600 })

db.campagnes.createIndex(
  { zone: 1 },
  { partialFilterExpression: { statut: "OUVERTE" } }
)
6 Notion

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.

🛢️ Sur le projet Fioul Groupé

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.

Ce qu'il faut retenir du chapitre
  • Un index évite le parcours complet (COLLSCAN → IXSCAN).
  • createIndex() ; on mesure avec explain("executionStats").
  • Index composés : l'ordre compte (règle ESR).
  • Variantes : unique, TTL, partiel. Un index a un coût en écriture/espace.
← Chapitre 10