В MongoDB можете да използвате cursor.explain()
метод или db.collection.explain()
метод за определяне дали дадена заявка използва индекс или не.
Тези методи ви позволяват да видите плана на заявката за заявката, който включва дали използва индекс или не.
Пример
Да предположим, че имаме колекция, наречена pets
, и съдържа следните документи:
{ "_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 }
И да предположим, че създаваме следния индекс върху неговото name
поле:
db.pets.createIndex( { "name" : 1 } )
Сега, когато изпълним следната заявка, тя трябва да използва този индекс:
db.pets.find( { "name" : "Scratch" } )
Резултат:
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
Но не можем да разберем само като погледнем резултатите дали е използвал индекса или не.
Това е мястото, където explain()
идва методът. Можем да добавим explain()
до края на нашата заявка, за да получите плана на заявката. Това ще ни покаже дали е използвал индекс или не.
db.pets.find( { "name" : "Scratch" } ).explain()
Резултат:
{ "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 }
Можем да видим от частта, която чете IXSCAN
че заявката използва индексно сканиране, за да произведе своите резултати.
За разлика от това, ако направим същото за заявка, която не е включена в нашия индекс, ще видим, че използва сканиране на колекция (COLLSCAN
):
db.pets.find( { "type" : "Dog" } ).explain()
Резултат:
{ "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()
Метод
db.collection.explain()
методът е подобен на cursor.explain()
, с изключение на това с db.collection.explain()
, можете да свържете допълнителни модификатори на заявка към заявката (след find()
метод).
За нашите цели можем да направим следното:
db.pets.explain().find( { "name": "Scratch" } )
Резултат:
{ "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 }
Можете да изпълните следната команда, за да извлечете списък с модификатори на заявка, налични за този метод:
db.collection.explain().find().help()