MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Finden Sie heraus, ob eine Abfrage einen Index in MongoDB verwendet

In MongoDB können Sie cursor.explain() verwenden Methode oder die db.collection.explain() Methode, um festzustellen, ob eine Abfrage einen Index verwendet.

Mit diesen Methoden können Sie den Abfrageplan für die Abfrage anzeigen, einschließlich dessen, ob ein Index verwendet wird oder nicht.

Beispiel

Angenommen, wir haben eine Sammlung namens pets , und es enthält die folgenden Dokumente:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }

Und nehmen wir an, wir erstellen den folgenden Index für seinen name Feld:

db.pets.createIndex( { "name" : 1 } )

Wenn wir jetzt die folgende Abfrage ausführen, sollte sie diesen Index verwenden:

db.pets.find( { "name" : "Scratch" } )

Ergebnis:

{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }

Aber wir können anhand der Ergebnisse nicht erkennen, ob der Index verwendet wurde oder nicht.

Hier ist der explain() Methode kommt herein. Wir können explain() anhängen bis zum Ende unserer Abfrage, um den Abfrageplan zu erhalten. Das wird uns sagen, ob es einen Index verwendet hat oder nicht.

db.pets.find( { "name" : "Scratch" } ).explain()

Ergebnis:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"name" : {
				"$eq" : "Scratch"
			}
		},
		"queryHash" : "01AEE5EC",
		"planCacheKey" : "4C5AEA2C",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"name" : 1
				},
				"indexName" : "name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"name" : [
						"[\"Scratch\", \"Scratch\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Wir können das an dem Teil erkennen, der IXSCAN lautet dass die Abfrage einen Index-Scan verwendet, um ihre Ergebnisse zu erzeugen.

Wenn wir dagegen dasselbe für eine Abfrage tun, die nicht in unserem Index enthalten ist, sehen wir, dass sie einen Sammlungsscan verwendet (COLLSCAN ):

db.pets.find( { "type" : "Dog" } ).explain()

Ergebnis:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"type" : {
				"$eq" : "Dog"
			}
		},
		"queryHash" : "2A1623C7",
		"planCacheKey" : "2A1623C7",
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"type" : {
					"$eq" : "Dog"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Die db.collection.explain() Methode

Die db.collection.explain() Methode ähnelt cursor.explain() , außer das mit db.collection.explain() , können Sie zusätzliche Abfragemodifikatoren mit der Abfrage verketten (nach dem find() Methode).

Für unsere Zwecke können wir Folgendes tun:

db.pets.explain().find( { "name": "Scratch" } )

Ergebnis:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"name" : {
				"$eq" : "Scratch"
			}
		},
		"queryHash" : "01AEE5EC",
		"planCacheKey" : "4C5AEA2C",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"name" : 1
				},
				"indexName" : "name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"name" : [
						"[\"Scratch\", \"Scratch\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Sie können den folgenden Befehl ausführen, um eine Liste der für diese Methode verfügbaren Abfragemodifikatoren abzurufen:

db.collection.explain().find().help()