MongoDB-Indizierung meistern für optimale Abfrageleistung

Erzielen Sie optimale Abfrageleistung in MongoDB, indem Sie Indizierungstechniken meistern. Dieser umfassende Leitfaden behandelt Einzelfeld-, zusammengesetzte und Multikey-Indizes, erklärt die Leistungsfähigkeit von abdeckenden Abfragen und führt Sie durch die Verwendung von `explain()` zur Leistungsanalyse. Lernen Sie Best Practices, um Ihre Lesevorgänge zu beschleunigen, die Datenbanklast zu reduzieren und eine reaktionsschnellere Anwendung zu erstellen. Pflichtlektüre für jeden MongoDB-Entwickler, der sich auf Leistungsoptimierung konzentriert.

MongoDB-Indizierung meistern für optimale Abfrageleistung

MongoDB-Indizierung wird interessant, wenn die Datenbank nicht mehr klein genug für glückliche Zufälle ist. Eine Abfrage, die sich in der Entwicklung sofort anfühlte, kann in der Produktion schmerzhaft werden, sobald eine Sammlung Millionen von Dokumenten hat, ein Dashboard eine Sortierung hinzufügt oder ein API-Endpunkt beginnt, nach mehreren Feldern gleichzeitig zu filtern.

Das Ziel ist nicht, jedes Feld zu indizieren. Das verlangsamt normalerweise Schreibvorgänge, verbraucht Speicher und Festplatte und lässt wichtige Abfragen immer noch unberücksichtigt. Das Ziel ist, die Handvoll Abfrageformen zu verstehen, von denen Ihre Anwendung tatsächlich abhängt, und dann Indizes zu erstellen, die diesen Formen entsprechen.

MongoDB-Indizes verstehen

Im Kern ist ein Index wie ein Index in einem Buch. Anstatt das gesamte Buch zu lesen, um ein Thema zu finden, konsultieren Sie eine sortierte Referenz und springen nahe an die richtige Seite. MongoDB-Indizes helfen dem Abfrageplaner, passende Dokumente zu finden, ohne die gesamte Sammlung zu durchsuchen. Ohne einen nützlichen Index führt MongoDB möglicherweise einen Sammlungs-Scan durch, bei dem Dokumente einzeln untersucht werden, bis Übereinstimmungen gefunden werden.

Sammlungs-Scans sind nicht immer böse. Das Scannen einer winzigen Sammlung kann in Ordnung sein. Das Ausführen eines Admin-Berichts einmal im Monat kann in Ordnung sein. Aber ein Sammlungs-Scan innerhalb eines stark frequentierten Anforderungspfades ist anders. Er konkurriert mit normalen Lese- und Schreibvorgängen, wird mit zunehmenden Daten schlimmer und zeigt sich oft als unvorhersehbare Latenz.

Wie Indizes funktionieren

MongoDB verwendet üblicherweise B-Tree-ähnliche Indizes für normale Feldindizes. Das wichtige praktische Detail ist, dass indizierte Werte in der richtigen Reihenfolge gespeichert werden. Diese Reihenfolge hilft MongoDB bei Gleichheitsfiltern, Bereichsfiltern und Sortierungen, wenn die Abfrageform mit dem Index übereinstimmt.

Zum Beispiel ist ein Index auf { email: 1 } perfekt für:

db.users.findOne({ email: "[email protected]" })

Er ist nicht nützlich für:

db.users.find({ lastLoginAt: { $lt: ISODate("2025-01-01") } })

Diese zweite Abfrage benötigt einen Index, der mit lastLoginAt beginnt, oder sie muss scannen.

Wann Indizes verwendet werden sollten

Indizes sind am vorteilhaftesten für Felder, die häufig verwendet werden in:

  • Abfragekriterien (find(), findOne()): Felder, die im filter-Dokument Ihrer Abfragen verwendet werden.
  • Sortierkriterien (sort()): Felder, die verwendet werden, um die Ergebnisse Ihrer Abfragen zu ordnen.
  • _id-Feld: Standardmäßig erstellt MongoDB einen Index auf dem _id-Feld, was Eindeutigkeit und schnelle Nachschlagevorgänge nach ID gewährleistet.

Indizes haben jedoch auch Kosten:

  • Speicherplatz: Indizes verbrauchen Festplattenspeicher.
  • Schreibleistung: Indizes müssen aktualisiert werden, wenn Dokumente eingefügt, aktualisiert oder gelöscht werden, was Schreibvorgänge verlangsamen kann.
  • Speicherdruck: Häufig verwendete Indexseiten konkurrieren um den Cache. Zu viele große Indizes können es erschweren, den Arbeitssatz im Speicher zu halten.

Daher ist es entscheidend, Indizes strategisch zu erstellen und sich auf Felder zu konzentrieren, die die größten Leistungssteigerungen für Ihre häufigen Lesevorgänge bringen.

Indizes erstellen und verwalten

MongoDB bietet die Methode createIndex() zum Erstellen von Indizes und getIndexes() zum Anzeigen vorhandener Indizes. Die Methode dropIndex() wird verwendet, um sie zu entfernen.

Grundlegende Indexerstellung

Um einen Einzelfeldindex zu erstellen, geben Sie den Feldnamen und den Indextyp an (normalerweise 1 für aufsteigend oder -1 für absteigend).

db.collection.createIndex( { fieldName: 1 } );

Beispiel: Indizieren eines username-Feldes in aufsteigender Reihenfolge:

db.users.createIndex( { username: 1 } );

Indizes anzeigen

Um die Indizes einer Sammlung anzuzeigen:

db.collection.getIndexes();

Beispiel: Anzeigen der Indizes der users-Sammlung:

db.users.getIndexes();

Dies gibt ein Array von Indexdefinitionen zurück, einschließlich des standardmäßigen _id-Index.

Erstellen Sie Indizes in einer stark frequentierten Sammlung bewusst. Moderne MongoDB-Versionen unterstützen in vielen gängigen Fällen Online-Indexerstellungen, aber Indexerstellungen verbrauchen dennoch CPU, Festplatten-I/O und Speicher. Planen Sie in Produktionssystemen große Indexerstellungen während ruhigerer Zeiten und beobachten Sie die Replikationsverzögerung, wenn Sie ein Replikat-Set betreiben.

Indizes löschen

Um einen Index zu entfernen:

db.collection.dropIndex( "indexName" );

Sie finden den indexName in der Ausgabe von getIndexes(). Alternativ können Sie einen Index löschen, indem Sie das/die indizierte(n) Feld(er) im gleichen Format wie createIndex() angeben:

db.collection.dropIndex( { fieldName: 1 } );

Beispiel: Löschen des username-Index:

db.users.dropIndex( "username_1" ); // Verwendung des Indexnamens
// ODER
db.users.dropIndex( { username: 1 } ); // Verwendung der Indexdefinition

Bevor Sie einen Index löschen, überprüfen Sie, ob ihn noch etwas verwendet:

db.users.aggregate([{ $indexStats: {} }])

Dies zeigt Zugriffszähler seit dem Start des Servers. Ein Zähler von Null ist ein Hinweis, kein absoluter Beweis. Der Server wurde möglicherweise kürzlich neu gestartet, oder die Abfrage läuft nur während eines wöchentlichen Jobs. Kombinieren Sie für wichtige Systeme $indexStats, Anwendungscode-Suche, Abfrageprotokolle und einen kurzen Beobachtungszeitraum.

Zusammengesetzte Indizes

Zusammengesetzte Indizes umfassen mehrere Felder. Die Reihenfolge der Felder in einem zusammengesetzten Index ist entscheidend. MongoDB verwendet zusammengesetzte Indizes für Abfragen, die mehrere Felder in den filter- oder sort-Klauseln betreffen.

Wann zusammengesetzte Indizes verwendet werden sollten

Zusammengesetzte Indizes sind am effektivsten, wenn Ihre Abfragen häufig nach einer Kombination von Feldern filtern oder sortieren. Der Index kann Abfragen erfüllen, die mit den Feldern in derselben Reihenfolge übereinstimmen, in der sie im Index definiert sind, oder mit einem Präfix des Index.

Beispiel: Betrachten Sie eine Sammlung von orders mit Feldern wie userId, orderDate und status. Wenn Sie häufig nach Bestellungen eines bestimmten Benutzers suchen und nach Datum sortieren, wäre ein zusammengesetzter Index auf { userId: 1, orderDate: 1 } sehr vorteilhaft.

db.orders.createIndex( { userId: 1, orderDate: 1 } );

Dieser Index kann Abfragen wie die folgenden effizient unterstützen:

  • db.orders.find( { userId: "user123" } ).sort( { orderDate: -1 } )
  • db.orders.find( { userId: "user123", orderDate: { $lt: ISODate() } } )

Er könnte jedoch weniger effektiv für Abfragen sein, die nur nach orderDate filtern, wenn userId nicht ebenfalls angegeben ist, oder wenn die Felder in einer anderen Reihenfolge sind.

Die Feldreihenfolge ist wichtig

Die Reihenfolge der Felder in einem zusammengesetzten Index bestimmt, welche Abfragemuster er gut unterstützen kann. Eine nützliche Faustregel ist, Gleichheitsfelder zuerst, dann Sortierfelder, dann Bereichsfelder. Dies wird oft als ESR-Richtlinie bezeichnet: Gleichheit, Sortierung, Bereich. Es ist eine Richtlinie, kein Gesetz, aber es verhindert viele schlechte Indexdesigns.

Angenommen, Ihre Bestellseite führt diese Abfrage aus:

db.orders.find({
  tenantId: "t1",
  status: "paid",
  createdAt: { $gte: ISODate("2025-01-01") }
}).sort({ createdAt: -1 })

Ein vernünftiger Index könnte sein:

db.orders.createIndex({ tenantId: 1, status: 1, createdAt: -1 })

tenantId und status sind Gleichheitsfilter. createdAt unterstützt die Sortierung und den Bereich. Wenn Sie stattdessen { createdAt: -1, status: 1, tenantId: 1 } erstellen, wird MongoDB ihn in einigen Fällen möglicherweise trotzdem verwenden, aber er ist normalerweise weniger auf diese Abfrage abgestimmt.

Für Abfragen, die Ergebnisse sortieren, sollte die Reihenfolge der Felder im Index mit der Reihenfolge der Felder in der sort()-Operation übereinstimmen, um eine optimale Leistung zu erzielen. Wenn eine Abfrage sowohl einen Filter als auch eine Sortierung enthält und der Index mit den Filterfeldern übereinstimmt, kann er auch für die Sortierung verwendet werden, ohne einen separaten Sammlungs-Scan für die Sortierung.

Zusammengesetzte Indizes können auch Präfixabfragen bedienen. Ein Index auf { tenantId: 1, status: 1, createdAt: -1 } kann einer Abfrage auf tenantId allein oder tenantId plus status helfen. Er kann im Allgemeinen nicht viel bei einer Abfrage auf status allein helfen, da status nicht das führende Feld ist.

Abdeckende Abfragen

Eine abdeckende Abfrage ist eine Abfrage, bei der MongoDB die gesamte Abfrage nur unter Verwendung des Index erfüllen kann. Dies bedeutet, dass der Index alle Felder enthält, die abgefragt und projiziert werden. Abdeckende Abfragen vermeiden das Abrufen von Dokumenten aus der Sammlung selbst, was sie extrem schnell macht.

So erreichen Sie abdeckende Abfragen

Um eine abdeckende Abfrage zu erreichen, stellen Sie Folgendes sicher:

  1. Sie haben einen Index, der alle Felder enthält, die im Filter der Abfrage verwendet werden.
  2. Sie nehmen nur diese indizierten Felder (oder eine Teilmenge davon) in Ihre Projektion auf.

Beispiel: Betrachten Sie eine employees-Sammlung mit den Feldern name, age und city. Wenn Sie einen Index { city: 1, age: 1 } haben und die Namen und Alter von Mitarbeitern in einer bestimmten Stadt abrufen möchten, können Sie eine abdeckende Abfrage erstellen:

db.employees.find( { city: "New York" }, { name: 1, age: 1, _id: 0 } ).explain()

In dieser Abfrage ist city im Index, und name und age sind in der Projektion enthalten. Wenn der Index auch name und age enthielte, wäre es eine abdeckende Abfrage.

Lassen Sie uns den Index und die Abfrage für eine echte abdeckende Abfrage verfeinern:

// Erstellen Sie einen Index, der alle für die Abfrage und Projektion benötigten Felder enthält
db.employees.createIndex( { city: 1, age: 1, name: 1 } );

// Nun kann eine Abfrage, die nach Stadt filtert und Name und Alter projiziert, abgedeckt werden
db.employees.find( { city: "New York" }, { name: 1, age: 1, _id: 0 } )

Wenn Sie explain("executionStats") für diese Abfrage ausführen, sollte ein abgedeckter Plan Indexschlüssel untersuchen, ohne vollständige Dokumente aus der Sammlung abzurufen. In vielen Erklärungsplänen bedeutet dies, dass Sie eine IXSCAN ohne eine FETCH-Stufe sehen, und totalDocsExamined sollte 0 sein. Die Explain-Ausgabe variiert je nach MongoDB-Version und Abfrageform, konzentrieren Sie sich also auf die tatsächlichen Planstufen und untersuchten Zählungen, anstatt nach einem genauen Label zu suchen.

Abdeckende Abfragen sind nützlich für heiße Lesepfade wie Autovervollständigung, kleine Listenansichten oder Berechtigungsprüfungen. Sie sind weniger nützlich, wenn die Projektion große Felder, viele Felder oder Felder enthält, die sich ständig ändern. Das Hinzufügen zu vieler Felder zu einem Index, nur um eine Abfrage abzudecken, kann einen sperrigen Index erzeugen, der die Schreibleistung beeinträchtigt.

Andere wichtige Indextypen

MongoDB bietet verschiedene Indextypen für spezifische Anwendungsfälle:

Multikey-Indizes

Multikey-Indizes werden automatisch erstellt, wenn Sie ein Array-Feld indizieren. Sie ermöglichen es Ihnen, Elemente in Arrays abzufragen.

Beispiel: Wenn Sie eine products-Sammlung mit einem tags-Array-Feld ["electronics", "gadgets"] haben:

db.products.createIndex( { tags: 1 } );

Dieser Index unterstützt Abfragen wie db.products.find( { tags: "electronics" } ).

Arrays erfordern bei zusammengesetzten Indizes besondere Sorgfalt. Ein Multikey-Index speichert Einträge für Array-Elemente, was die Indexgröße schnell erhöhen kann. MongoDB hat auch Einschränkungen in Bezug auf zusammengesetzte Multikey-Indizes, wenn mehr als ein indiziertes Feld Arrays im selben Dokument enthalten kann. Wenn Ihr Datenmodell mehrere Arrays und komplexe Filter hat, testen Sie die genaue Abfrage mit repräsentativen Daten, bevor Sie annehmen, dass sich ein zusammengesetzter Index so verhält wie ein Skalarfeld-Index.

Textindizes

Textindizes unterstützen die effiziente Suche nach Zeichenfolgeninhalten in Dokumenten. Sie werden für Textsuchabfragen mit dem $text-Operator verwendet.

db.articles.createIndex( { content: "text" } );

Dies ermöglicht Suchen wie: db.articles.find( { $text: { $search: "Datenbankleistung" } } ).

Textindizes sind nützlich für die grundlegende Textsuche, aber sie sind keine vollständige Suchplattform. Wenn Sie erweiterte Relevanzoptimierung, Tippfehlertoleranz, Facettierung, Hervorhebung oder sprachspezifisches Suchverhalten benötigen, sind MongoDB Atlas Search oder eine dedizierte Suchmaschine möglicherweise die bessere Wahl.

Geodatenindizes

Geodatenindizes werden für die effiziente Abfrage geografischer Daten mit den Operatoren $near, $geoWithin und $geoIntersects verwendet.

db.locations.createIndex( { loc: "2dsphere" } ); // Für 2dsphere-Index

Eindeutige Indizes

Eindeutige Indizes erzwingen die Eindeutigkeit eines Feldes oder einer Kombination von Feldern. Wenn ein doppelter Wert eingefügt oder aktualisiert wird, gibt MongoDB einen Fehler zurück.

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

Normalisieren Sie für Produktionsbenutzertabellen, bevor Sie die Eindeutigkeit erzwingen. E-Mail-Adressen sind ein häufiges Beispiel. Wenn Ihre Anwendung [email protected] und [email protected] als denselben Benutzer behandelt, speichern Sie ein normalisiertes Feld wie emailLower und setzen Sie den eindeutigen Index dort. Verlassen Sie sich nicht allein auf Anwendungscode, um Duplikate unter Parallelität zu verhindern.

Partielle Indizes

Partielle Indizes indizieren nur Dokumente, die einem Filterausdruck entsprechen. Sie sind nützlich, wenn sich eine Abfrage auf eine Teilmenge einer Sammlung konzentriert.

db.orders.createIndex(
  { tenantId: 1, createdAt: -1 },
  { partialFilterExpression: { status: "open" } }
)

Dies kann helfen, wenn Ihre Anwendung häufig offene Bestellungen liest und geschlossene Bestellungen den größten Teil der Sammlung ausmachen. Der Index ist kleiner, weil er Dokumente ausschließt, die nicht dem partiellen Filter entsprechen. Die Abfrage muss eine kompatible Bedingung enthalten, damit MongoDB ihn verwendet.

TTL-Indizes

TTL-Indizes entfernen Dokumente automatisch nach einer konfigurierten Zeit. Sie werden häufig für Sitzungen, temporäre Token oder kurzlebige Ereignisse verwendet.

db.sessions.createIndex(
  { expiresAt: 1 },
  { expireAfterSeconds: 0 }
)

Die TTL-Löschung erfolgt nicht sofort zum genauen Ablaufzeitpunkt. MongoDB entfernt abgelaufene Dokumente im Hintergrund. Verwenden Sie es zur Bereinigung, nicht für präzises Sicherheits-Timing, bei dem ein Token sofort ungültig werden muss. Ihre Anwendung sollte dennoch den Ablauf beim Lesen überprüfen.

Leistungsanalyse mit explain()

Zu verstehen, wie MongoDB Ihre Abfragen ausführt, ist entscheidend für deren Optimierung. Die Methode explain() bietet Einblicke in den Abfrageausführungsplan, einschließlich der Frage, ob ein Index verwendet wurde und wie.

db.collection.find( {...} ).explain( "executionStats" );

Wichtige Felder, auf die Sie in der explain()-Ausgabe achten sollten:

  • winningPlan.stage: Gibt die Stufe des Ausführungsplans an (z. B. COLLSCAN für Sammlungs-Scan, IXSCAN für Index-Scan).
  • executionStats.totalKeysExamined: Die Anzahl der untersuchten Indexschlüssel.
  • executionStats.totalDocsExamined: Die Anzahl der untersuchten Dokumente.

Ein guter Ausführungsplan hat totalDocsExamined nahe oder gleich der Anzahl der zurückgegebenen Dokumente und totalKeysExamined deutlich geringer als die Gesamtzahl der Dokumente in der Sammlung. Wenn totalDocsExamined sehr hoch ist oder COLLSCAN verwendet wird, deutet dies darauf hin, dass ein Index fehlt oder nicht effektiv genutzt wird.

So lese ich schnell einen Explain-Plan:

  1. Suchen Sie nach COLLSCAN. Wenn dies ein heißer Pfad ist und die Sammlung groß ist, ist das normalerweise das erste Problem.
  2. Suchen Sie nach IXSCAN gefolgt von FETCH. Ein Fetch ist normal, wenn die Abfrage Felder außerhalb des Index benötigt, aber eine übermäßige Dokumentenprüfung bedeutet, dass der Index nicht selektiv genug ist.
  3. Vergleichen Sie nReturned, totalKeysExamined und totalDocsExamined. 20 Dokumente nach der Untersuchung von 25 Schlüsseln zurückzugeben, ist gesund. 20 Dokumente nach der Untersuchung von 500.000 Schlüsseln zurückzugeben, ist es nicht.
  4. Achten Sie auf In-Memory-Sortierungen. Wenn MongoDB nach dem Filtern einen großen Ergebnissatz sortieren muss, kann ein zusammengesetzter Index, der die Sortierung unterstützt, helfen.

Verwenden Sie realistische Filter beim Testen. Ein Explain-Plan für tenantId: "demo" passt möglicherweise nicht zu einem großen Mandanten mit Millionen von Dokumenten. Die Datenverteilung ist wichtig.

Ein praktischer Leitfaden zum Indexdesign

Stellen Sie sich eine Anwendung mit einer tickets-Sammlung vor. Support-Agenten verwenden eine Warteschlangenseite mit diesen Filtern:

db.tickets.find({
  tenantId: "acme",
  status: "open",
  assigneeId: "u123"
}).sort({ updatedAt: -1 }).limit(50)

Beginnen Sie mit der Abfrageform, nicht mit der Feldliste. Die Sammlung ist mandantenfähig, Agenten filtern normalerweise nach Status und Bearbeiter, und die UI sortiert zuerst die neuesten Aktualisierungen. Ein praktischer Index ist:

db.tickets.createIndex({
  tenantId: 1,
  status: 1,
  assigneeId: 1,
  updatedAt: -1
})

Betrachten Sie nun eine andere Seite: Manager sehen alle offenen Tickets, unabhängig vom Bearbeiter:

db.tickets.find({
  tenantId: "acme",
  status: "open"
}).sort({ updatedAt: -1 }).limit(100)

Der vorherige Index kann das Präfix { tenantId, status } verwenden, aber assigneeId steht vor updatedAt, sodass er die Sortierung für diese Managerabfrage möglicherweise nicht so gut unterstützt. Möglicherweise benötigen Sie einen zweiten Index:

db.tickets.createIndex({
  tenantId: 1,
  status: 1,
  updatedAt: -1
})

Das ist ein normaler Kompromiss. Ein Index dient selten jedem Bildschirm perfekt. Die Aufgabe ist es, die wichtigen Pfade zu unterstützen, ohne einen Haufen überlappender Indizes zu erstellen, die alle Schreibvorgänge kosten.

Best Practices für die MongoDB-Indizierung

  • Indizieren Sie nur, was Sie brauchen: Vermeiden Sie es, Indizes für Felder zu erstellen, die selten abgefragt oder sortiert werden. Jeder Index fügt Overhead hinzu.
  • Verwenden Sie zusammengesetzte Indizes mit Bedacht: Ordnen Sie Felder basierend auf Abfragemustern richtig an. Berücksichtigen Sie zuerst die selektivsten Felder.
  • Zielen Sie auf abdeckende Abfragen ab: Wenn die Lesleistung kritisch ist, entwerfen Sie Indizes, um häufige Lesevorgänge abzudecken.
  • Überwachen Sie die Indexnutzung: Überprüfen Sie regelmäßig die Indexnutzung mit explain() und db.collection.aggregate([{ $indexStats: {} }]), um ungenutzte oder ineffiziente Indizes zu identifizieren.
  • Berücksichtigen Sie die Indexselektivität: Indizes auf Feldern mit niedriger Kardinalität (wenige unterschiedliche Werte) sind möglicherweise nicht so effektiv wie solche auf Feldern mit hoher Kardinalität.
  • Halten Sie Indizes klein: Vermeiden Sie es, große Felder oder Arrays in Indizes aufzunehmen, es sei denn, es ist für abdeckende Abfragen unbedingt erforderlich.
  • Testen Sie Ihre Indizes: Testen Sie die Auswirkungen neuer Indizes sowohl auf die Lese- als auch auf die Schreibleistung unter realistischen Lastbedingungen.
  • Entfernen Sie redundante Indizes sorgfältig: Wenn Sie { a: 1, b: 1 } haben, kann ein separater { a: 1 }-Index für viele Arbeitslasten redundant sein. Bestätigen Sie die Nutzung, bevor Sie löschen.
  • Entwerfen Sie basierend auf echten Bildschirmen und Jobs: Indizes sollten dem Anwendungsverhalten zugeordnet sein: Login-Suche, Warteschlangenseite, Berichtsfilter, Hintergrundarbeiter-Scan.
  • Überprüfen Sie nach Schemaänderungen: Ein neues Feld, eine neue Sortierreihenfolge oder ein neues Mandantenmodell können einen alten Index weniger nützlich machen.

Wie sich gute Indizierung anfühlt

Gute MongoDB-Indizierung ist normalerweise leise. Die wichtigen Abfragen untersuchen ungefähr die Datenmenge, die sie zurückgeben. Sortierungen laufen nicht in teure Arbeit über. Schreibvorgänge werden nicht durch ein Dutzend spekulativer Indizes belastet. Wenn eine neue Funktion eine neue Abfrageform hinzufügt, testen Sie sie mit explain("executionStats"), bevor sie zu einem Produktionsvorfall wird.

Die praktische Gewohnheit ist einfach: Sammeln Sie die echte Abfrage, entwerfen Sie den kleinsten nützlichen Index für diese Abfrageform, testen Sie mit repräsentativen Daten und überprüfen Sie die Indexnutzung im Laufe der Zeit weiter. Diese Gewohnheit wird mehr für die MongoDB-Leistung tun, als jeden Indextyp auswendig zu lernen.