Database Management

MongoDB: Compound-Indizes meistern

Spread the love

Compound-Indizes in MongoDB meistern

Dieser Leitfaden befasst sich mit den Feinheiten von Compound-Indizes in MongoDB, einer entscheidenden Technik zur Optimierung der Datenbankleistung. Wir behandeln alles, vom Verständnis ihrer grundlegenden Funktionsweise über die Analyse ihrer Effektivität bis hin zur Fehlerbehebung bei häufig auftretenden Problemen.

  1. Compound-Indizes verstehen
  2. Compound-Indizes erstellen
  3. Abfragen mit Compound-Indizes
  4. Analyse der Indexnutzung
  5. Best Practices und Optimierung
  6. Häufig gestellte Fragen

1. Compound-Indizes verstehen

In MongoDB ist ein Compound-Index ein Index, der sich über mehrere Felder innerhalb eines einzelnen Dokuments erstreckt. Im Gegensatz zu Einzel-Feld-Indizes, die nur Abfragen zu einem einzelnen Feld beschleunigen, steigern Compound-Indizes die Geschwindigkeit von Abfragen, die mehrere Felder betreffen, dramatisch und wirken sich erheblich auf die Anwendungsleistung aus. Die Reihenfolge der Felder innerhalb des Index ist entscheidend; MongoDB nutzt diese Reihenfolge, um Dokumente effizient zu finden.

Abfragen, die mit den führenden Feldern des Index übereinstimmen, profitieren am meisten. Wenn eine Abfrage nur die führenden Felder verwendet, wird der Index sowohl zum Filtern als auch zum Sortieren vollständig genutzt. Wenn eine Abfrage jedoch Felder über den Index hinaus verwendet, kann MongoDB den Index teilweise nutzen und möglicherweise auf einen Collection-Scan für die restlichen Kriterien zurückgreifen, wodurch die Leistungsgewinne zunichte gemacht werden.

Betrachten Sie beispielsweise eine products-Collection mit den Feldern category, price und name. Ein Compound-Index auf { "category": 1, "price": -1 } optimiert Abfragen, die nach category filtern und dann nach price in absteigender Reihenfolge sortieren.

2. Compound-Indizes erstellen

Das Erstellen von Compound-Indizes ist mit der Methode db.collection.createIndex() unkompliziert. Das Argument ist ein Dokument, wobei die Schlüssel Feldnamen und die Werte die Sortierreihenfolge darstellen (1 für aufsteigend, -1 für absteigend).


// Erstellt einen Compound-Index für category (aufsteigend) und price (absteigend)
db.products.createIndex( { category: 1, price: -1 } );

// Erstellt einen Compound-Index für mehrere Felder mit unterschiedlichen Sortierreihenfolgen
db.users.createIndex( { firstName: 1, lastName: -1, age: 1 } );

// Fügt unique und sparse Optionen hinzu
db.products.createIndex( { category: 1, price: -1 }, { unique: true, sparse: true } );

unique: true erzwingt die Eindeutigkeit über die indizierten Felder hinweg, während sparse: true nur Dokumente indiziert, bei denen die indizierten Felder nicht null sind.

3. Abfragen mit Compound-Indizes

Der Abfrageoptimierer von MongoDB nutzt automatisch einen Compound-Index, wenn die Abfrage mit den führenden Feldern übereinstimmt und die Sortierreihenfolge passt. Beispielsweise profitiert die folgende Abfrage vom Index { "category": 1, "price": -1 }:


db.products.find( { category: "Electronics" } ).sort( { price: -1 } );

Diese Abfrage filtert nach category (dem führenden Indexfeld) und sortiert nach price (entsprechend der Sortierreihenfolge des Index). Diese Abfrage würde jedoch nicht so stark profitieren:


db.products.find( { price: { $lt: 100 } } ).sort( { category: 1 } );

price ist nicht das führende Feld, und die Sortierreihenfolge stimmt nicht mit dem Index überein.

4. Analyse der Indexnutzung

Verwenden Sie db.collection.find().explain(), um die Indexnutzung zu analysieren. Dies liefert detaillierte Informationen über den Abfrageausführungsplan, einschließlich der verwendeten (oder nicht verwendeten) Indizes und der Ausführungszeiten.


db.products.find( { category: "Electronics" } ).sort( { price: -1 } ).explain();

Prüfen Sie den Abschnitt „executionStats“. Wenn der Index verwendet wird, sehen Sie die Indexschlüsselnutzung und die Anzahl der geprüften Dokumente. „COLLSCAN“ zeigt einen vollständigen Collection-Scan an, der weniger effizient ist als die Indexnutzung.

5. Best Practices und Optimierung

Eine sorgfältige Indexauswahl ist entscheidend. Überindizierung verlangsamt Schreibvorgänge, während Unterindizierung zu ineffizienten Abfragen führt. Priorisieren Sie häufig verwendete Abfragemuster und fügen Sie nach Bedarf schrittweise Indizes hinzu. Überwachen Sie die Indexnutzung regelmäßig und passen Sie sie an die Anwendungsbedürfnisse an. Erwägen Sie die Verwendung der MongoDB Compass-GUI für eine einfachere Indexverwaltung.

6. Häufig gestellte Fragen

  • Wie viele Compound-Indizes sollte ich erstellen? Die optimale Anzahl hängt von den Abfragemustern Ihrer Anwendung ab. Es ist ein Gleichgewicht zwischen zu vielen und zu wenigen Indizes notwendig.
  • Was ist, wenn meine Abfrage nicht perfekt mit dem Index übereinstimmt? MongoDB kann Teile des Index verwenden, aber möglicherweise immer noch auf einen Collection-Scan für nicht übereinstimmende Teile zurückgreifen.
  • Kann ich Compound-Indizes mit gemischten aufsteigenden/absteigenden Feldern erstellen? Ja, die Reihenfolge ist entscheidend für eine optimale Leistung.
  • Wie lösche ich einen Compound-Index? Verwenden Sie db.collection.dropIndex() und geben Sie den Indexnamen oder die Spezifikation an:

// Löschen nach Namen
db.products.dropIndex("category_1_price_-1");

// Löschen nach Spezifikation
db.products.dropIndex( { category: 1, price: -1 } );

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert