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()