MongoDB - Abfragen analysieren

Das Analysieren von Abfragen ist ein sehr wichtiger Aspekt, um zu messen, wie effektiv das Datenbank- und Indizierungsdesign ist. Wir werden etwas über die häufig verwendeten lernen$explain und $hint Anfragen.

Mit $ EXPLAIN

Das $explainDer Operator bietet Informationen zur Abfrage, zu den in einer Abfrage verwendeten Indizes und zu anderen Statistiken. Dies ist sehr nützlich, wenn Sie analysieren möchten, wie gut Ihre Indizes optimiert sind.

Im letzten Kapitel hatten wir bereits einen Index für die erstellt users Sammlung auf Feldern gender und user_name mit der folgenden Abfrage -

>db.users.createIndex({gender:1,user_name:1})
{
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 2,
	"note" : "all indexes already exist",
	"ok" : 1
}

Wir werden jetzt verwenden $explain auf die folgende Abfrage -

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

Die obige EXPLAIN () - Abfrage gibt das folgende analysierte Ergebnis zurück:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "mydb.users",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"gender" : {
				"$eq" : "M"
			}
		},
		"queryHash" : "B4037D3C",
		"planCacheKey" : "DEAAE17C",
		"winningPlan" : {
			"stage" : "PROJECTION_COVERED",
			"transformBy" : {
				"user_name" : 1,
				"_id" : 0
			},
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"gender" : 1,
					"user_name" : 1
				},
				"indexName" : "gender_1_user_name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"gender" : [ ],
					"user_name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"gender" : [
						"[\"M\", \"M\"]"
					],
					"user_name" : [
						"[MinKey, MaxKey]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "Krishna",
		"port" : 27017,
		"version" : "4.2.1",
		"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok" : 1
}

Wir werden uns nun die Felder in dieser Ergebnismenge ansehen -

  • Der wahre Wert von indexOnly gibt an, dass diese Abfrage die Indizierung verwendet hat.

  • Das cursorFeld gibt den Typ des verwendeten Cursors an. Der BTreeCursor-Typ gibt an, dass ein Index verwendet wurde, und gibt auch den Namen des verwendeten Index an. BasicCursor zeigt an, dass ein vollständiger Scan ohne Verwendung von Indizes durchgeführt wurde.

  • n Gibt die Anzahl der zurückgegebenen Dokumente an.

  • nscannedObjects Gibt die Gesamtzahl der gescannten Dokumente an.

  • nscanned Gibt die Gesamtzahl der gescannten Dokumente oder Indexeinträge an.

$ Hinweis verwenden

Das $hintDer Operator zwingt das Abfrageoptimierungsprogramm, den angegebenen Index zum Ausführen einer Abfrage zu verwenden. Dies ist besonders nützlich, wenn Sie die Leistung einer Abfrage mit verschiedenen Indizes testen möchten. Die folgende Abfrage gibt beispielsweise den Index für Felder angender und user_name für diese Abfrage verwendet werden -

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
{ "user_name" : "tombenzamin" }

Um die obige Abfrage mit $ EXPLAIN zu analysieren -

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

Welches gibt Ihnen das folgende Ergebnis -

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "mydb.users",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"gender" : {
				"$eq" : "M"
			}
		},
		"queryHash" : "B4037D3C",
		"planCacheKey" : "DEAAE17C",
		"winningPlan" : {
			"stage" : "PROJECTION_COVERED",
			"transformBy" : {
				"user_name" : 1,
				"_id" : 0
			},
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"gender" : 1,
					"user_name" : 1
				},
				"indexName" : "gender_1_user_name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"gender" : [ ],
					"user_name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"gender" : [
						"[\"M\", \"M\"]"
					],
					"user_name" : [
						"[MinKey, MaxKey]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "Krishna",
		"port" : 27017,
		"version" : "4.2.1",
		109
		"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok" : 1
}