एक सामान्य मानक क्वेरी को देखते हुए (बिना limit()
या sort()
या कुछ भी फैंसी लागू) जिसमें दो क्षेत्रों पर फ़िल्टर की स्थिति है (जैसा कि name
. में है और age
आपके उदाहरण में), परिणामी दस्तावेजों को खोजने के लिए, MongoDB या तो:
- एक पूर्ण संग्रह स्कैन करें (संपूर्ण संग्रह में प्रत्येक दस्तावेज़ को पढ़ें, बीएसओएन को पार्स करें, प्रश्न में मूल्यों को ढूंढें, इनपुट के खिलाफ उनका परीक्षण करें और प्रत्येक दस्तावेज़ को वापस/त्यागें):यह सुपर I/O तीव्र है और इसलिए धीमा है।
- एक अनुक्रमणिका का उपयोग करें जो एक फ़ील्ड रखता है (दस्तावेज़ों के प्रासंगिक सबसेट का पता लगाने के लिए इंडेक्स ट्री का उपयोग करें और उसके बाद उनका स्कैन करें):आपके डेटा वितरण/इंडेक्स चयनात्मकता के आधार पर यह बहुत तेज़ हो सकता है या मुश्किल से कोई लाभ प्रदान कर सकता है (
age
30 से 40 साल के बीच के लाखों लोगों के डेटासेट में ---> हर लुकअप में अब भी अनगिनत दस्तावेज़ मिलेंगे)। - दो अनुक्रमणिका का उपयोग करें जिसमें एक साथ दोनों फ़ील्ड शामिल हों (दोनों इंडेक्स लोड करें, मुख्य लुकअप करें, फिर परिणामों के प्रतिच्छेदन की गणना करें):फिर से, आपके डेटा वितरण के आधार पर, यह आपको शानदार (एर) प्रदर्शन दे भी सकता है और नहीं भी। हालांकि, ज्यादातर मामलों में यह #2 से तेज होना चाहिए। हालांकि, मुझे आश्चर्य होगा अगर यह वास्तव में 10 गुना धीमा होता तो #4 (जैसा कि आपने बताया)।
- एक यौगिक अनुक्रमणिका का उपयोग करें (दो बाद के प्रमुख लुकअप तुरंत आवश्यक दस्तावेजों की ओर ले जाते हैं):यह सभी का सबसे तेज़ विकल्प होगा, क्योंकि इसे सही दस्तावेजों तक पहुंचने के लिए कम से कम और सबसे सस्ते संचालन की आवश्यकता होती है। पुन:उपयोग का सबसे बड़ा स्तर सुनिश्चित करने के लिए (न कि प्रदर्शन जो इससे प्रभावित नहीं होगा) आपको सामान्य रूप से सबसे पहले सबसे चुनिंदा क्षेत्र से शुरू करना चाहिए, इसलिए आपके मामले में शायद
name
और नहींage
यह देखते हुए कि बहुत से लोगों कीage
समान होगी (इतनी कम चयनात्मकता)name
. की तुलना में (उच्च चयनात्मकता)। लेकिन वह विकल्प आपके ठोस परिदृश्य और उन प्रश्नों पर भी निर्भर करता है जिन्हें आप अपने डेटाबेस के विरुद्ध चलाने का इरादा रखते हैं। आपकी विशिष्ट स्थिति के विभिन्न पहलुओं को ध्यान में रखते हुए एक मिश्रित अनुक्रमणिका को सर्वोत्तम रूप से परिभाषित करने के तरीके के बारे में वेब पर एक बहुत अच्छा लेख है:https://emptysqua.re/blog/optimizing-mongodb-compound-indexes
विचार करने के लिए अन्य पहलू हैं:इंडेक्स अपडेट एक निश्चित कीमत पर आते हैं। हालांकि, यदि आप केवल कच्ची पढ़ने की गति की परवाह करते हैं और आपके पास हर बार केवल कुछ अपडेट होते हैं, तो आपको अधिक/बड़े इंडेक्स के लिए जाना चाहिए।
और अंतिम लेकिन कम से कम (!) अच्छी तरह से उपयोग की जाने वाली निचली पंक्ति सलाह:वास्तविक डेटा और शायद यथार्थवादी लोड परिदृश्यों का उपयोग करके अपने सिस्टम से नरक को बाहर निकालें। और जैसे-जैसे आपका डेटा/सिस्टम समय के साथ बदलता है, मापते रहें।
अतिरिक्त पढ़ता है:https://docs.mongodb.com/manual/core/query-optimization/index.html
https://dba.stackexchange.com/questions/158240/mongodb-index-intersection-does-not-eliminate-the-need-for-creating-compound-in
इंडेक्स इंटरसेक्शन बनाम कंपाउंड इंडेक्स?
मोंगोडब कंपाउंड इंडेक्स बनाम इंडेक्स इंटरसेक्ट
MongoDB प्रदर्शन-वार में कंपाउंड इंडेक्स का क्रम कैसे मायने रखता है?
मोंगोडीबी में, मैं एक बड़ी क्वेरी का उपयोग कर रहा हूं, मैं कंपाउंड इंडेक्स या सिंगल इंडेक्स कैसे बनाऊंगा, इसलिए मेरा प्रतिक्रिया समय बढ़ जाता है