मैं क्रम में चार क्षेत्रों पर यौगिक सूचकांक के साथ एक संग्रह है: (ए, बी, सी, डी)
जब मैं की तरह
find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N)
सख्त साथ
क्वेरी है फ़ील्ड ए, बी, सी में बराबर है, यह बहुत तेज़ चलता है, जैसा कि होना चाहिए। और explain()
मुझे बताता है कि केवल एन दस्तावेज़ स्कैन किए गए थे।
अगर मैं $in
ऑपरेटर (सरणी में लगभग 100 तत्वों के साथ) के लिए बराबर में से एक को बदलने यह दस्तावेजों की बहुत अधिक संख्या को स्कैन करता है और बहुत धीरे चलता है:
find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N)
अन्य ऑपरेटरों $or
की तरह एक ही प्रभाव है।
तार्किक रूप से एक $in
100 तत्वों के साथ बहुत सख्त बराबरी के साथ 100 अलग-अलग प्रश्नों के समान होना चाहिए। दूसरा संस्करण भी बहुत कुछ डेटाबेस में तेजी से चलाता है लेकिन सभी तत्वों के बाद छंटाई और clientside पर सीमित के साथ (सीमा के बिना) हो रही है की आवश्यकता है।
यह बराबरी के साथ कई प्रश्नों में $in
के साथ इस एक क्वेरी को विभाजित करने की भावना कर्सर दस्तावेजों की कम संख्या को स्कैन करने के लिए बनाने के करता है? संग्रह में लाखों दस्तावेजों के मामले में और अधिक कुशल क्या होगा? {:, 1 सी: बी 1, एक: 1, डी: 1}
प्रलेखन कहते हैं, के बाद से MongoDB यौगिक सूचकांक में खेतों के आदेश v1.6.0 अब और कोई फर्क नहीं पड़ता: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ हालांकि , मैंने आपके संस्करण की कोशिश की और कुछ भी नहीं बदला। – DenisNP
@ डेनिस एनपी: यदि आपका मतलब है [यह एक] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-4.Conserveindexesbyreorderingcolumnsusedonequality%28nonrange%29queries।), तो आपको यह मिल गया गलत। फ़ील्ड का आदेश ** ** सूचकांक में मामला है। यह सिर्फ इतना कहता है कि आप बिना किसी गंभीर प्रदर्शन हिट के अंत में (फ़ील्ड इंडेक्स परिभाषा) के कुछ फ़ील्ड छोड़ सकते हैं। –
@ सर्जीओ टुएंटेसेव: मेरा मतलब है [यह पीला फ्रेम] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ- इंडेक्सिंगप्रॉपर्टीज)। क्या मै गलत हु? – DenisNP