sql >> Database >  >> NoSQL >> MongoDB

Zoek uit of een zoekopdracht een index in MongoDB gebruikt

In MongoDB kunt u de cursor.explain() . gebruiken methode of de db.collection.explain() methode om te bepalen of een zoekopdracht al dan niet een index gebruikt.

Met deze methoden kunt u het queryplan voor de query bekijken, inclusief het al dan niet gebruiken van een index.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets , en het bevat de volgende documenten:

{ "_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 }

En stel dat we de volgende index maken op zijn name veld:

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

Als we nu de volgende query uitvoeren, zou deze die index moeten gebruiken:

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

Resultaat:

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

Maar door alleen naar de resultaten te kijken, kunnen we niet zien of het de index heeft gebruikt of niet.

Dit is waar de explain() methode komt binnen. We kunnen explain() . toevoegen aan het einde van onze query om het queryplan te krijgen. Dat zal ons vertellen of het een index heeft gebruikt.

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

Resultaat:

{
	"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
}

We kunnen zien aan het deel dat leest IXSCAN dat de zoekopdracht een indexscan gebruikt om de resultaten te produceren.

Als we daarentegen hetzelfde doen voor een zoekopdracht die niet in onze index is opgenomen, zullen we zien dat deze een collectiescan gebruikt (COLLSCAN ):

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

Resultaat:

{
	"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
}

De db.collection.explain() Methode

De db.collection.explain() methode is vergelijkbaar met cursor.explain() , behalve dat met db.collection.explain() , kunt u aanvullende query-modifiers aan de query koppelen (na de find() methode).

Voor onze doeleinden kunnen we het volgende doen:

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

Resultaat:

{
	"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
}

U kunt de volgende opdracht uitvoeren om een ​​lijst met beschikbare querymodifiers voor deze methode op te halen:

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


  1. Python- en MongoDB-databaseontwikkeling

  2. mangoest aangepaste validatie met behulp van 2 velden

  3. MongoDB $dayOfMonth

  4. Hoe representeer je MongoDB GeoJSON-velden in een Mongoose-schema?