Funktionsweise von MongoDB-B-Tree-Indizes
Sie verfolgen, wie MongoDB Indexeinträge in einem B-Tree speichert und wie der Abfrageplaner den Baum durchläuft, um einen Filter zu erfüllen.
Funktionsweise von MongoDB-B-Tree-Indizes ist eine kostenlose MongoDB Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des MongoDB Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der MongoDB Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Indizes existieren
Ohne Index muss MongoDB jedes Dokument einer Collection durchsuchen, um eine Abfrage zu erfüllen – dies wird als Collection Scan (COLLSCAN) bezeichnet. Bei einer Collection mit Millionen von Dokumenten kann ein COLLSCAN Sekunden oder sogar Minuten dauern. Ein Index ist eine separate, geordnete Datenstruktur, mit der MongoDB direkt zu den passenden Dokumenten springen kann – innerhalb von Mikrosekunden.
Die B-Baum-Datenstruktur
MongoDB verwendet einen B-Baum (balancierten Baum), um Indexeinträge zu speichern. Ein B-Baum ist als Hierarchie von Knoten organisiert: oben befindet sich der Wurzelknoten, in der Mitte liegen interne Knoten und unten die Blattknoten. Jeder Knoten enthält mehrere Schlüssel-Wert-Paare und Verweise auf untergeordnete Knoten. Der Baum bleibt balanciert – alle Blattknoten befinden sich auf derselben Ebene –, sodass Suchvorgänge unabhängig vom gesuchten Wert immer gleich viele Schritte benötigen.
So werden Indexeinträge gespeichert
Wenn Sie einen Index für ein Feld wie age erstellen, baut MongoDB einen B-Baum auf, in dem jeder Eintrag eines Blattknotens den Wert des indizierten Feldes zusammen mit einem Verweis (der RecordId) auf das tatsächliche Dokument auf dem Datenträger enthält. Die Einträge werden aufsteigend oder absteigend sortiert, je nachdem, wie Sie den Index definieren. Da der Baum sortiert ist, kann MongoDB Gleichheitssuchen, Bereichsabfragen und Sortiervorgänge aus derselben Struktur bedienen.
// 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)Der Abfrageplaner und IXSCAN
Jede Abfrage durchläuft den Abfrageplaner von MongoDB. Dieser bewertet die verfügbaren Indizes und wählt den effizientesten Ausführungsplan. Wenn der Planer einen geeigneten Index findet, verwendet er anstelle eines COLLSCAN den Schritt IXSCAN (Index Scan). Ein IXSCAN durchläuft den B-Baum von der Wurzel bis zu den passenden Blattknoten und lädt anschließend mithilfe der RecordId-Verweise nur die relevanten Dokumente vom Datenträger.
// See which plan MongoDB chose
db.users.find({ age: { $gt: 30 } }).explain('executionStats');Indexverwendung für Gleichheit, Bereiche und Sortierung
Ein B-Baum-Index unterstützt drei Arten von Zugriffsmustern: Gleichheitssuchen (den exakten Schlüssel finden), Bereichsscans (zusammenhängende Blattknoten zwischen zwei Grenzen durchlaufen) und Sortiervorgänge (der Baum ist bereits geordnet, daher ist keine Sortierung im Arbeitsspeicher erforderlich). Diese dreifache Fähigkeit macht einen gut platzierten Index deutlich nützlicher, als es zunächst erscheinen mag.
// 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 });Indexrichtung: aufsteigend oder absteigend
Wenn Sie einen Index mit 1 erstellen, werden die Einträge aufsteigend gespeichert; -1 speichert sie absteigend. Bei einem Index für ein einzelnes Feld spielt die Richtung kaum eine Rolle, da MongoDB den B-Baum in beide Richtungen durchlaufen kann. Bei zusammengesetzten Indizes wird die Richtung entscheidend, da die Kombination der Richtungen mit der von Ihren Abfragen verwendeten Sortierreihenfolge übereinstimmen muss.
// Ascending index
db.orders.createIndex({ createdAt: 1 });
// Descending index (useful for 'newest first' sorts)
db.orders.createIndex({ createdAt: -1 });Indexgröße und Arbeitsspeicher
MongoDB versucht, den Arbeitsbestand der Indizes im RAM (dem WiredTiger-Cache) zu halten. Wenn ein Index vollständig in den Arbeitsspeicher passt, sind Suchvorgänge praktisch kostenlose E/A-Operationen. Ist ein Index zu groß für den RAM, muss MongoDB Indexknoten vom Datenträger nachladen, was zu starken Latenzspitzen führt. Deshalb sollten Sie Indizes schlank halten: Indizieren Sie nur Felder, die Sie tatsächlich abfragen, und verwenden Sie Projektionen, um nicht benötigte Daten nicht zurückzugeben.
// Check index sizes in bytes
db.users.stats().indexSizes;
// Example output:
// { '_id_': 856064, 'age_1': 442368 }Abfragen, die vollständig durch einen Index abgedeckt sind
Eine abgedeckte Abfrage ist eine Abfrage, bei der alle Felder des Filters und der Projektion im Index vorhanden sind. MongoDB kann eine solche Abfrage ausschließlich mithilfe des Index-B-Baums beantworten und muss das eigentliche Dokument nie vom Datenträger laden. Abgedeckte Abfragen sind äußerst schnell und sollten für besonders häufig verwendete Lesezugriffe gezielt eingeplant werden.
// 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 }
);Der _id-Index ist immer vorhanden
Jede MongoDB-Collection verfügt automatisch über einen eindeutigen B-Baum-Index für _id. Dieser Standardindex ist der Grund dafür, dass Suchen nach _id auch in sehr großen Collections immer schnell sind. Sie können den _id-Index nicht löschen. Alle anderen Indizes sind optional und müssen von der Entwicklerin, dem Entwickler oder der Datenbankadministration ausdrücklich erstellt werden.
// MongoDB creates this automatically:
// { '_id': 1 } (unique)
// Fast because _id is always indexed:
db.orders.findOne({ _id: ObjectId('64a1f...') });Schreibaufwand durch Indizes
Indizes beschleunigen Lesevorgänge, verlangsamen aber Schreibvorgänge. Bei jedem Einfügen, Aktualisieren oder Löschen muss nicht nur das Dokument auf dem Datenträger, sondern auch jeder B-Baum aktualisiert werden, der ein Feld dieses Dokuments indiziert. Eine Collection mit 10 Indizes verursacht bei jedem Einfügen 10 zusätzliche B-Baum-Schreibvorgänge. Dieser Zielkonflikt bedeutet, dass Sie nur Indizes erstellen sollten, die tatsächlichen Abfragemustern dienen – ungenutzte Indizes verursachen weiterhin Schreibaufwand.
// 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: {} }]);Multikey-Indizes für Arrays
Wenn Sie ein Feld indizieren, das ein Array enthält, erstellt MongoDB einen Multikey-Index und fügt für jedes Array-Element einen B-Baum-Eintrag ein. Dadurch können Abfragen wie { tags: 'mongodb' } den Index verwenden, obwohl tags ein Array ist. MongoDB erkennt Array-Felder automatisch und setzt das Multikey-Flag. Beim Erstellen des Index müssen Sie nichts Besonderes beachten.
// 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' });Kurzer Check
Testen Sie Ihr Verständnis der MongoDB-B-Baum-Indizes aus dieser Lektion.
Zusammenfassung der Lektion
In dieser Lektion haben Sie gelernt: MongoDB verwendet B-Baum-Strukturen, deren sortierte Blatteinträge auf RecordIds von Dokumenten verweisen, der Abfrageplaner wählt IXSCAN statt COLLSCAN, wenn ein geeigneter Index vorhanden ist, und Indizes beschleunigen Lesevorgänge, verursachen aber zusätzlichen Schreibaufwand. Als Nächstes beschäftigen wir uns mit dem Erstellen von Indizes für einzelne Felder und zusammengesetzten Indizes.
Lerne JavaScript mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 30
- Lektionen
- 120
Häufig gestellte Fragen
Ist die Lektion „Funktionsweise von MongoDB-B-Tree-Indizes“ kostenlos?
Ja — der vollständige Text von „Funktionsweise von MongoDB-B-Tree-Indizes“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des MongoDB Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der MongoDB Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Funktionsweise von MongoDB-B-Tree-Indizes“?
Sie verfolgen, wie MongoDB Indexeinträge in einem B-Tree speichert und wie der Abfrageplaner den Baum durchläuft, um einen Filter zu erfüllen. Du übst MongoDB Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um MongoDB Academy zu starten?
Keine Vorkenntnisse erforderlich. MongoDB Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Funktionsweise von MongoDB-B-Tree-Indizes“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser MongoDB Academy-Lektion Code schreiben und ausführen?
Ja. Jede MongoDB Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Funktionsweise von MongoDB-B-Tree-Indizes
- Einzelfeld- und zusammengesetzte Indizes erstellen
- Indexeigenschaften: Unique, Sparse, Partial, TTL
- explain()-Ausgaben zur Diagnose von Abfragen lesen