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