MongoDB Academy · Leçon

Fonctionnement des index B-tree de MongoDB

Les apprenants suivront la manière dont MongoDB stocke les entrées d’index dans un arbre B-tree et dont le planificateur de requêtes parcourt cet arbre pour satisfaire un filtre.

Leçon 1 sur 413 étapes

Fonctionnement des index B-tree de MongoDB est une leçon MongoDB Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage MongoDB Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours MongoDB Academy comprend 4 leçons au total.

Pourquoi les index existent

Sans index, MongoDB doit parcourir chaque document d’une collection pour répondre à une requête — cette opération s’appelle un parcours de collection (COLLSCAN). Dans une collection contenant des millions de documents, un COLLSCAN peut prendre plusieurs secondes, voire plusieurs minutes. Un index est une structure de données distincte et ordonnée qui permet à MongoDB d’accéder directement aux documents correspondants en quelques microsecondes.

La structure de données en arbre B

MongoDB utilise un arbre B (arbre équilibré) pour stocker les entrées d’index. Un arbre B est organisé sous forme de hiérarchie de nœuds : un nœud racine au sommet, des nœuds internes au milieu et des nœuds feuilles à la base. Chaque nœud contient plusieurs paires clé-valeur et des pointeurs vers les nœuds enfants. L’arbre reste équilibré — tous les nœuds feuilles se trouvent à la même profondeur — de sorte que les recherches nécessitent toujours le même nombre d’étapes, quelle que soit la valeur recherchée.

Comment les entrées d’index sont stockées

Lorsque vous créez un index sur un champ comme age, MongoDB construit un arbre B dont chaque entrée de nœud feuille contient la valeur du champ indexé associée à un pointeur (le RecordId) vers le document réel sur le disque. Les entrées sont triées par ordre croissant ou décroissant selon la définition de l’index. Comme l’arbre est trié, MongoDB peut répondre aux recherches par égalité, aux requêtes par intervalle et aux opérations de tri à partir de la même structure.

// Index on 'age' field
db.users.createIndex({ age: 1 });
// MongoDB now has a sorted B-tree:
// 18 -> RecordId(doc1)
// 25 -> RecordId(doc4)
// 31 -> RecordId(doc2)
// 47 -> RecordId(doc7)

Le planificateur de requêtes et IXSCAN

Chaque requête passe par le planificateur de requêtes de MongoDB, qui évalue les index disponibles et choisit le plan d’exécution le plus efficace. Lorsque le planificateur trouve un index approprié, il utilise une étape IXSCAN (parcours d’index) au lieu d’un COLLSCAN. Un IXSCAN parcourt l’arbre B depuis la racine jusqu’aux nœuds feuilles correspondants, puis récupère uniquement les documents pertinents sur le disque à l’aide de leurs pointeurs RecordId.

// See which plan MongoDB chose
db.users.find({ age: { $gt: 30 } }).explain('executionStats');

Utilisation des index pour l’égalité, les intervalles et le tri

Un index en arbre B prend en charge trois types de schémas d’accès : les recherches par égalité (trouver la clé exacte), les parcours d’intervalle (parcourir les nœuds feuilles contigus entre deux limites) et les opérations de tri (l’arbre étant déjà ordonné, aucun tri en mémoire n’est nécessaire). Cette triple capacité rend un index bien placé beaucoup plus utile qu’il n’y paraît au premier abord.

// Equality - single leaf node lookup
db.users.find({ username: 'alice' });

// Range - scan contiguous leaf nodes
db.users.find({ age: { $gte: 20, $lte: 30 } });

// Sort - traverses tree in order, no sort stage
db.users.find({}).sort({ age: 1 });

Sens de l’index : croissant ou décroissant

Lorsque vous créez un index avec 1, les entrées sont stockées dans l’ordre croissant ; avec -1, elles sont stockées dans l’ordre décroissant. Pour un index sur un seul champ, le sens importe peu, car MongoDB peut parcourir l’arbre B dans les deux directions. Le sens devient essentiel pour les index composés, lorsque la combinaison des sens doit correspondre à l’ordre de tri utilisé par vos requêtes.

// Ascending index
db.orders.createIndex({ createdAt: 1 });

// Descending index (useful for 'newest first' sorts)
db.orders.createIndex({ createdAt: -1 });

Taille des index et mémoire

MongoDB essaie de conserver l’ensemble de travail des index dans la RAM (le cache WiredTiger). Lorsqu’un index tient entièrement en mémoire, les recherches sont pratiquement des opérations d’E/S gratuites. Lorsqu’un index est trop volumineux pour la RAM, MongoDB doit charger ses nœuds depuis le disque par pagination, ce qui provoque des pics de latence. C’est pourquoi vous devez conserver des index compacts : n’indexez que les champs sur lesquels vous effectuez réellement des requêtes et utilisez une projection pour éviter de renvoyer des données inutilisées.

// Check index sizes in bytes
db.users.stats().indexSizes;
// Example output:
// { '_id_': 856064, 'age_1': 442368 }

Requêtes couvertes

Une requête couverte est une requête dont tous les champs du filtre et de la projection sont présents dans l’index. MongoDB peut répondre à une telle requête en utilisant uniquement l’arbre B de l’index : il n’a jamais besoin de récupérer le document réel sur le disque. Les requêtes couvertes sont extrêmement rapides et méritent d’être prévues pour vos chemins de lecture les plus sollicités.

// Index on email and name
db.users.createIndex({ email: 1, name: 1 });

// Covered query: filter on email, project email+name only
// MongoDB only reads the index, never the document
db.users.find(
  { email: 'a@b.com' },
  { _id: 0, email: 1, name: 1 }
);

L’index _id est toujours présent

Chaque collection MongoDB possède automatiquement un index unique en arbre B sur _id. Cet index par défaut explique pourquoi les recherches sur _id sont toujours rapides, même dans des collections gigantesques. Vous ne pouvez pas supprimer l’index _id. Tous les autres index sont facultatifs et doivent être créés explicitement par le développeur ou le DBA.

// MongoDB creates this automatically:
// { '_id': 1 }  (unique)

// Fast because _id is always indexed:
db.orders.findOne({ _id: ObjectId('64a1f...') });

Coût d’écriture des index

Les index accélèrent les lectures, mais ralentissent les écritures. Chaque insertion, mise à jour ou suppression doit mettre à jour non seulement le document sur le disque, mais aussi chaque arbre B qui indexe un champ de ce document. Une collection contenant 10 index entraîne 10 écritures supplémentaires dans des arbres B pour chaque insertion. Ce compromis signifie que vous ne devez créer que des index correspondant à de véritables schémas de requêtes : les index inutilisés continuent de faire payer un coût d’écriture sans apporter de bénéfice.

// List all indexes and their sizes
db.users.getIndexes();

// Identify unused indexes (MongoDB 4.4+)
// $indexStats shows usage counts since last restart
db.users.aggregate([{ $indexStats: {} }]);

Index multiclés pour les tableaux

Lorsque vous indexez un champ qui contient un tableau, MongoDB crée un index multiclé — il insère une entrée d’arbre B pour chaque élément du tableau. Cela permet à des requêtes comme { tags: 'mongodb' } d’utiliser l’index, même si tags est un tableau. MongoDB détecte automatiquement les champs de type tableau et active l’indicateur multiclé ; vous n’avez rien de particulier à faire lors de la création de l’index.

// Document with array field
// { title: 'Guide', tags: ['mongodb', 'nosql', 'database'] }

// Single index creation
db.articles.createIndex({ tags: 1 });
// MongoDB creates THREE B-tree entries:
// 'database' -> RecordId
// 'mongodb'  -> RecordId
// 'nosql'    -> RecordId

// This query now uses IXSCAN
db.articles.find({ tags: 'mongodb' });

Vérification rapide

Vérifiez votre compréhension des index en arbre B de MongoDB présentés dans cette leçon.

Récapitulatif de la leçon

Dans cette leçon, vous avez appris que MongoDB utilise des structures en arbre B dont les entrées feuilles triées pointent vers les RecordIds des documents, que le planificateur de requêtes choisit IXSCAN plutôt que COLLSCAN lorsqu’un index approprié existe et que les index accélèrent les lectures, mais ajoutent un coût aux écritures. Nous allons maintenant étudier la création d’index sur un seul champ et d’index composés.

Gratuit pour commencer

Apprends JavaScript avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
30
Leçons
120

Questions Fréquemment Posées

La leçon « Fonctionnement des index B-tree de MongoDB » est-elle gratuite ?

Oui — le texte complet de « Fonctionnement des index B-tree de MongoDB » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours MongoDB Academy, passe à CoddyKit PRO. Le cours MongoDB Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Fonctionnement des index B-tree de MongoDB » ?

Les apprenants suivront la manière dont MongoDB stocke les entrées d’index dans un arbre B-tree et dont le planificateur de requêtes parcourt cet arbre pour satisfaire un filtre. Tu pratiques MongoDB Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer MongoDB Academy ?

Aucune expérience préalable n'est requise. MongoDB Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Fonctionnement des index B-tree de MongoDB » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon MongoDB Academy ?

Oui. Chaque leçon MongoDB Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Fonctionnement des index B-tree de MongoDB
  2. Créer des index à un champ et composés
  3. Propriétés des index : unique, sparse, partial, TTL
  4. Lire la sortie de explain() pour diagnostiquer les requêtes
← Retour à MongoDB Academy