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