Dieses Kapitel führt in die Analyse der MongoDB-Abfrageleistung ein. Ähnlich wie bei SQL "explain" unterstützt MongoDB auch "explain", um die Leistung von Abfragesätzen zu analysieren.
Grundlegende Verwendung
Durch Aufrufen der "explain"-Funktion können Sie das Analyseergebnis erhalten
// Analyseergebnis der find-Methode
db.collection.find({}).explain();
// Analyseergebnis der aggregate-Methode
db.collection.explain().aggregate([]);
"explain" hat drei Modi:
- queryPlanner (Standard)
- executionStats
- allPlansExecution
Erklärung:
- Bei Verwendung von "queryPlanner" werden nur alle möglichen Ausführungspläne aufgelistet, die tatsächliche Anweisung jedoch nicht ausgeführt. Es wird der gewinnende Plan "winningPlan" angezeigt.
- Bei Verwendung von "executionStats" wird nur der "winningPlan" ausgeführt und das Ergebnis ausgegeben.
- Bei Verwendung von "allPlansExecution" werden alle Pläne ausgeführt und die Ergebnisse ausgegeben.
Verwendung unterschiedlicher Modi
// executionStats-Modus, einfach Parameter an die explain-Funktion übergeben
db.collection.find({}).explain('executionStats');
// allPlansExecution-Modus
db.collection.find({}).explain('allPlansExecution');
Erläuterung des Inhalts des explain
Inhalt des queryPlanner
Der folgende Inhalt ist der Standardinhalt, der von "explain" zurückgegeben wird, unter Berücksichtigung von nichtschlüsselbezogenen Informationen
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.orders",
"indexFilterSet" : false, // Schlüsselmetrik, ob Daten mit Indexfilterung verwendet werden
"winningPlan" : {
"stage" : "COLLSCAN", // Schlüsselmetrik, Name der Phasenstufe. Jede Phase hat phasenspezifische Informationen, z.B. steht COLLSCAN für das Scannen des gesamten Inhalts der Sammlung
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
...
}
Phasentypen sind:
- COLLSCAN: Vollständiges Tabellenscan
- IXSCAN: Indexscan
- FETCH: Abrufen spezifischer Dokumente basierend auf dem Index
- SHARD_MERGE: Zusammenführen der von jedem Shard zurückgegebenen Daten
- SORT: Gibt das Sortieren im Speicher an
- LIMIT: Begrenzt die Anzahl der Rückgaben
- SKIP: Verwendung von "Skip"
- IDHACK: Abfrage für _id
- SHARDING_FILTER: Abfrage sharded Daten durch mongos
- COUNT: Count-Operationen mit db.coll.explain().count() oder ähnlichem
- COUNTSCAN: Rückgabestufe, wenn für "count" kein Index verwendet wird
- COUNT_SCAN: Rückgabestufe, wenn für "count" ein Index verwendet wird
- SUBPLA: Rückgabestufe für $or-Abfragen ohne Verwendung von Indizes
- TEXT: Rückgabestufe bei Abfragen mit Volltextindizes
- PROJECTION: Rückgabestufe zur Begrenzung der zurückgegebenen Felder
executionStats-Inhalt
Der folgende Inhalt ist der Inhalt, der im executionStats-Modus zurückgegeben wird, unter Berücksichtigung von nichtschlüsselbezogenen Informationen
{
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 5, // Anzahl der zurückgegebenen Dokumente
"executionTimeMillis" : 0, // Ausführungszeit
"totalKeysExamined" : 0, // Wie viele Indizes wurden gescannt
"totalDocsExamined" : 5, // Gesamtzahl gescannter Dokumente
"executionStages" : {
"stage" : "COLLS CAN", // Phasentyp, COLLSCAN bedeutet Scannen der gesamten Tabelle
"nReturned" : 5,
"executionTimeMillisEstimate" : 0,
"works" : 7,
"advanced" : 5,
"needTime" : 1,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 5
}
}
}
Abfrageoptimierungsideen
- Verwenden Sie nach Möglichkeit Indizes
- Je weniger Dokumente gescannt werden, desto besser