sql >> Databáze >  >> NoSQL >> MongoDB

Zjistěte, zda dotaz používá index v MongoDB

V MongoDB můžete použít cursor.explain() nebo db.collection.explain() metoda k určení, zda dotaz používá index.

Tyto metody vám umožňují zobrazit plán dotazů pro dotaz, který zahrnuje, zda používá či nepoužívá index.

Příklad

Předpokládejme, že máme sbírku nazvanou pets a obsahuje následující dokumenty:

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

A předpokládejme, že vytvoříme následující index na jeho name pole:

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

Nyní, když spustíme následující dotaz, měl by použít tento index:

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

Výsledek:

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

Pouhým pohledem na výsledky však nemůžeme zjistit, zda index použil nebo ne.

Toto je místo explain() přichází metoda. Můžeme připojit explain() na konec našeho dotazu, abychom získali plán dotazů. To nám řekne, zda používal index.

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

Výsledek:

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

Můžeme vidět podle části, která zní IXSCAN že dotaz používá k vytvoření výsledků skenování indexu.

Pokud naopak uděláme totéž pro dotaz, který není zahrnut v našem indexu, uvidíme, že používá skenování kolekce (COLLSCAN ):

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

Výsledek:

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

db.collection.explain() Metoda

db.collection.explain() metoda je podobná cursor.explain() , kromě toho pomocí db.collection.explain() , můžete k dotazu přiřadit další modifikátory dotazu (za find() metoda).

Pro naše účely můžeme provést následující:

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

Výsledek:

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

Chcete-li získat seznam modifikátorů dotazu dostupných pro tuto metodu, můžete spustit následující příkaz:

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


  1. Porovnání výkonu používání hashů Redis vs. mnoha klíčů

  2. Jak vytvořím výpis MongoDB své databáze?

  3. Aktualizace a vrácení dokumentu v Mongodb

  4. Návrh schématu MongoDB:Vždy existuje schéma