रेड्सेंड्रो,
आपको Index Cardinality
. पर विचार करना चाहिए और Selectivity
।
1. इंडेक्स कार्डिनैलिटी
इंडेक्स कार्डिनैलिटी से तात्पर्य है कि किसी क्षेत्र के लिए कितने संभावित मूल्य हैं। फ़ील्ड sex
केवल दो संभावित मान हैं। इसकी बहुत कम कार्डिनैलिटी है . अन्य फ़ील्ड जैसे names, usernames, phone numbers, emails
, आदि का संग्रह में प्रत्येक दस्तावेज़ के लिए अधिक विशिष्ट मूल्य होगा, जिसे उच्च कार्डिनैलिटी माना जाता है .
-
ग्रेटर कार्डिनैलिटी
किसी फ़ील्ड की कार्डिनैलिटी जितनी अधिक होगी एक अनुक्रमणिका उतनी ही अधिक सहायक होगी, क्योंकि अनुक्रमणिका खोज स्थान को संकीर्ण करती है, जिससे यह बहुत छोटा समूह बन जाता है।
यदि आपके पास
sex
. पर एक अनुक्रमणिका है और तुम यूहन्ना नाम के पुरूषों को ढूंढ़ रहे हो। यदि आपsex
. द्वारा अनुक्रमित करते हैं तो आप परिणाम स्थान को लगभग %50 तक ही सीमित कर देंगे प्रथम। इसके विपरीत यदि आपनेname
. द्वारा अनुक्रमित किया है , आप तुरंत परिणाम सेट को जॉन नाम के उपयोगकर्ताओं के एक मिनट के अंश तक सीमित कर देंगे, फिर आप लिंग की जांच के लिए उन दस्तावेज़ों को देखेंगे। -
अंगूठे का नियम
high-cardinality
. पर अनुक्रमणिका बनाने का प्रयास करें कुंजी याhigh-cardinality
put डालें कंपाउंड इंडेक्स में सबसे पहले चाबियां। आप इसके बारे में पुस्तक में यौगिक अनुक्रमणिका अनुभाग में अधिक पढ़ सकते हैं:MongoDB निश्चित मार्गदर्शिका
2. चयनात्मकता
साथ ही, आप अनुक्रमणिका का चुनिंदा रूप से उपयोग करना चाहते हैं और ऐसे प्रश्न लिखना चाहते हैं जो अनुक्रमित फ़ील्ड के साथ संभावित दस्तावेज़ों की संख्या को सीमित करते हैं। इसे सरल रखने के लिए, निम्नलिखित संग्रह पर विचार करें। अगर आपकी अनुक्रमणिका {name:1}
है , यदि आप क्वेरी चलाते हैं { name: "John", sex: "male"}
. आपको 1
scan को स्कैन करना होगा दस्तावेज़। क्योंकि आपने MongoDB को चयनात्मक होने की अनुमति दी है।
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
निम्नलिखित संग्रह पर विचार करें। अगर आपकी अनुक्रमणिका {sex:1}
है , यदि आप क्वेरी चलाते हैं {sex: "male", name: "John"}
. आपको 4
scan को स्कैन करना होगा दस्तावेज़।
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
एक बड़े डेटा सेट पर संभावित अंतरों की कल्पना करें।
यौगिक अनुक्रमणिका की एक छोटी सी व्याख्या
कंपाउंड इंडेक्स के बारे में गलत धारणा बनाना आसान है। कंपाउंड इंडेक्स पर मोंगोडीबी दस्तावेज़ों के मुताबिक।
<ब्लॉकक्वॉट>MongoDB यौगिक अनुक्रमणिका का समर्थन करता है, जहां एकल अनुक्रमणिका संरचना एकाधिक फ़ील्ड . के संदर्भ रखता है एक संग्रह के दस्तावेज़ों के भीतर। निम्नलिखित आरेख दो क्षेत्रों पर एक मिश्रित सूचकांक का एक उदाहरण दिखाता है:
जब आप एक मिश्रित अनुक्रमणिका बनाते हैं, 1 अनुक्रमणिका कई क्षेत्रों को धारण करेगा। इसलिए यदि हम किसी संग्रह को {"sex" : 1, "name" : 1}
. द्वारा अनुक्रमित करते हैं , सूचकांक मोटे तौर पर इस तरह दिखेगा:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
अगर हम किसी संग्रह को {"name" : 1, "sex" : 1}
. के आधार पर अनुक्रमित करते हैं , सूचकांक मोटे तौर पर इस तरह दिखेगा:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
{name:1}
Having होना क्योंकि कंपाउंड इंडेक्स का उपयोग करने में उपसर्ग आपकी बेहतर सेवा करेगा। इस विषय पर और भी बहुत कुछ पढ़ा जा सकता है, मुझे आशा है कि यह कुछ स्पष्टता प्रदान कर सकता है।