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.
- Compound-Indizes verstehen
- Compound-Indizes erstellen
- Abfragen mit Compound-Indizes
- Analyse der Indexnutzung
- Best Practices und Optimierung
- 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 } );