निचली पंक्ति / tl;dr: इंडेक्स b
'छोड़ा' जा सकता है अगर a
और c
समानता या असमानता के लिए पूछताछ की जाती है, लेकिन नहीं, उदाहरण के लिए, c
. पर प्रकार के लिए ।
यह एक बहुत अच्छा सवाल है। दुर्भाग्य से, मुझे ऐसा कुछ भी नहीं मिला जो आधिकारिक रूप से इसका अधिक विस्तार से उत्तर दे। मेरा मानना है कि पिछले वर्षों में इस तरह के प्रश्नों के प्रदर्शन में सुधार हुआ है, इसलिए मैं इस विषय पर पुरानी सामग्री पर भरोसा नहीं करूंगा।
पूरी बात काफी जटिल है क्योंकि यह आपकी अनुक्रमणिका पर चयनात्मकता पर निर्भर करती है और क्या आप समानता, असमानता और/या सॉर्ट के लिए क्वेरी करते हैं, इसलिए explain()
आपका एकमात्र मित्र है, लेकिन यहां कुछ चीजें हैं जो मुझे मिलीं:
चेतावनी :अब जो आता है वह प्रायोगिक परिणामों, तर्क और अनुमान का मिश्रण है। हो सकता है कि मैं काइल की सादृश्यता को बहुत आगे बढ़ा रहा हूं, और मैं पूरी तरह से गलत भी हो सकता हूं (और दुर्भाग्यपूर्ण, क्योंकि मेरे परीक्षा परिणाम मेरे तर्क से बहुत मेल खाते हैं)।
यह स्पष्ट है कि ए के सूचकांक का उपयोग किया जा सकता है, जो ए की चयनात्मकता के आधार पर निश्चित रूप से बहुत मददगार है। 'छोड़ना' बी मुश्किल हो सकता है, या नहीं। आइए इसे काइल की रसोई की किताब के उदाहरण के समान रखें:
French
Beef
...
Chicken
Coq au Vin
Roasted Chicken
Lamb
...
...
यदि आप अब मुझसे "चेटूब्रिआंड" नामक कोई फ्रेंच डिश खोजने के लिए कहते हैं, तो मैं इंडेक्स A
का उपयोग कर सकता हूं और, क्योंकि मैं सामग्री को नहीं जानता, मुझे A
. में सभी व्यंजन स्कैन करने होंगे . दूसरी ओर, मुझे पता है कि प्रत्येक श्रेणी में व्यंजनों की सूची को C
अनुक्रमणिका के माध्यम से क्रमबद्ध किया जाता है। , इसलिए मुझे प्रत्येक घटक-सूची में केवल "चा" से शुरू होने वाले स्ट्रिंग्स को देखना होगा। अगर 50 सामग्री हैं, तो मुझे केवल एक के बजाय 50 लुकअप की आवश्यकता होगी, लेकिन यह हर फ्रेंच डिश को स्कैन करने की तुलना में बहुत बेहतर है!
मेरे प्रयोगों में, संख्या b
. में अलग-अलग मानों की संख्या से बहुत कम थी :यह 2 से अधिक नहीं लग रहा था। हालांकि, मैंने इसे केवल एक संग्रह के साथ परीक्षण किया, और शायद इसे b
की चयनात्मकता के साथ करना है -सूचकांक।
अगर आपने मुझसे आपको सभी फ्रेंच व्यंजनों की वर्णानुक्रम में क्रमबद्ध सूची . देने के लिए कहा है , हालांकि, मैं मुसीबत में रहूंगा . अब C
. पर अनुक्रमणिका बेकार है, मुझे उन सभी इंडेक्स सूचियों को मर्ज-सॉर्ट करना होगा। ऐसा करने के लिए मुझे हर तत्व को स्कैन करना होगा।
यह मेरे परीक्षणों में परिलक्षित होता है। यहाँ कुछ सरलीकृत परिणाम दिए गए हैं। मूल संग्रह में datetimes, ints और string हैं, लेकिन मैं चीजों को सरल रखना चाहता था, इसलिए अब यह सभी ints है।
अनिवार्य रूप से, प्रश्नों के केवल दो वर्ग हैं:वे जहां nscanned
<=2 * limit
, और जिन्हें पूरे संग्रह (120k दस्तावेज़) को स्कैन करना है। सूचकांक {a, b, c}
. है :
// fast (range query on c while skipping b)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }});
// slow (sorting)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "c" : -1});
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "b" : -1});
// fast (can sort on c if b included in the query)
> db.Test.find({"a" : 43, "b" : 7887, "c" : { $lte : 45454 }}).sort({ "c" : -1});
// fast (older tutorials claim this is slow)
> db.Test.find({"a" : {$gte : 43}, "c" : { $lte : 45454 }});
आपका माइलेज अलग-अलग होगा।