MongoDB में इंडेक्स मैटर की दिशा क्यों होती है?


114

डॉक्स को उद्धृत करने के लिए :

इंडेक्स बनाते समय, कुंजी से जुड़ी संख्या इंडेक्स की दिशा को निर्दिष्ट करती है, इसलिए इसे हमेशा 1 (आरोही) या -1 (अवरोही) होना चाहिए। दिशा एकल कुंजी अनुक्रमों के लिए या यादृच्छिक अभिगम पुनर्प्राप्ति के लिए महत्वपूर्ण नहीं है, लेकिन यदि आप कंपाउंड इंडेक्स पर क्वेरी या श्रेणी क्वेरी कर रहे हैं, तो यह महत्वपूर्ण है।

हालांकि, मुझे कोई कारण नहीं दिखाई देता है कि यौगिक सूचकांक पर सूचकांक की दिशा क्या मायने रखती है। क्या कोई कृपया आगे स्पष्टीकरण (या एक उदाहरण) प्रदान कर सकता है?

जवाबों:


112

MongoDB किसी तरह से यौगिक कुंजी को समाप्‍त करता है और इसे BTree में कुंजी के रूप में उपयोग करता है।

एकल आइटम ढूंढते समय - पेड़ में नोड्स का क्रम अप्रासंगिक है।

यदि आप नोड्स की एक सीमा वापस कर रहे हैं - एक दूसरे के करीब तत्व पेड़ की समान शाखाओं के नीचे होंगे। जितने करीब नोड्स रेंज में हैं उतने जल्दी वे पुनः प्राप्त किए जा सकते हैं।

एक एकल फ़ील्ड इंडेक्स के साथ - ऑर्डर कोई मायने नहीं रखेगा। यदि वे आरोही क्रम में एक साथ पास हैं, तो वे अवरोही क्रम में भी एक साथ करीब होंगे।

जब आपके पास एक कंपाउंड कुंजी होती है - ऑर्डर शुरू होता है।

उदाहरण के लिए, यदि कुंजी एक आरोही बी है तो आरोही सूचकांक कुछ इस तरह दिख सकता है:

रो एबी
१ १ १
२ २ ६
३ २ 7 
४ ३ ४
५ ३ ५
६ ३ ६
५ १

आरोही बी अवरोही के लिए एक क्वेरी को पंक्तियों को वापस करने के लिए सूचकांक के चारों ओर कूदने की आवश्यकता होगी और धीमी होगी। उदाहरण के लिए यह रो को लौटाएगा1, 3, 2, 6, 5, 4, 7

एक क्रमबद्ध क्वेरी उसी क्रम में होगी जैसे सूचकांक बस क्रम में सही क्रम में पंक्तियों को लौटाएगा।

बीट्री में रिकॉर्ड खोजने में O (लॉग (n)) समय लगता है। क्रम में रिकॉर्ड की एक श्रेणी ढूँढना केवल ओलाग (n) + k है जहां k को वापस करने के लिए रिकॉर्ड की संख्या है।

यदि रिकॉर्ड क्रम से बाहर हैं, तो लागत ओयोग (एन) * के रूप में अधिक हो सकती है


1
परिणामी पंक्ति शायद होनी चाहिए 1, 3, 2, 6, 5, 4, 7?
जॉन्डोडो

मैं अभी भी इसे धीमा होने का कोई कारण नहीं देखता हूं। केवल एल्गोरिथ्म अलग होना चाहिए (ए में मूल्यों के प्रत्येक समूह के लिए इसे समूह के अंत तक कूदना चाहिए और इसे रिवर्स ऑर्डर में संसाधित करना चाहिए), लेकिन चूंकि MongoDB इंडेक्स स्मृति में हैं जो गति पर कोई ध्यान देने योग्य प्रभाव नहीं होना चाहिए। इसके अलावा, आरडीबीएमएस इंडेक्स के साथ दिशा के बारे में कुछ भी नहीं जानता है और स्थिति काफी समान है?
जॉन्डोडो

8
कारण यह एक प्रदर्शन हिट है क्योंकि यह सरलीकृत उदाहरण की तरह स्मृति में सिर्फ एक अनुक्रमिक सूची नहीं है। यह वास्तव में एक भारित वृक्ष है। ऑर्डर से बाहर कूदने में पेड़ को फिर से पीछे करना होगा। RDMS निश्चित रूप से अनुक्रमित करने के लिए आदेश है।
जारेड क्ल्स

1
बीट्री से नोड्स को क्रम में लाना प्रत्येक पत्ती के साथ बढ़ने तक सरल है जब तक आप बाहर नहीं निकलते हैं और फिर एक स्तर ऊपर और अगली शाखा के नीचे जाते हैं। यह O (n) आउट ऑफ़ ऑर्डर है यह बहुत अधिक CPU गहन है।
जारेड क्ल्स

आगे स्पष्टीकरण के लिए धन्यवाद। मैंने MySQL अनुक्रमित के लिए डॉक्स की जाँच की - यह वास्तव में सूचकांक दिशा निर्दिष्ट करना संभव है, लेकिन सेटिंग को अनदेखा किया गया है।
johndodo

45

आप जिस सरल उत्तर की तलाश कर रहे हैं, वह यह है कि दिशा केवल तब ही मायने रखती है जब आप दो या अधिक क्षेत्रों में छंटनी कर रहे हों

यदि आप छाँट रहे हैं {a : 1, b : -1}:

इंडेक्स की तुलना में इंडेक्स धीमा{a : 1, b : 1} होगा{a : 1, b : -1}


1
@MarkPieszak क्योंकि पूरी तरह से मेमोरी को इंडेक्स को बेकार बना दिया जाएगा
Sammaye

@Sammaye मुझे लगता है कि यह सही विचार है, हालांकि मुझे यकीन नहीं है कि यह पूरी तरह है। मैं कार्यान्वयन पता है कि कैसे यह वास्तव में काम करता है को देखने के लिए होगा, लेकिन मुझे लगता है कि परिणामों को वापस खींच लिया जा सकता है के अनुसार क्रमबद्ध लगता होगा एक अकेला, और फिर अतिरिक्त तरह स्मृति में किया जा करने की आवश्यकता होगी।
जायद मसूद

1
हम्म, अजीब पिछली बार जब मैंने कोड की जाँच की तो यह आंशिक रूप से गिरा दिया गया कि छँटाई कैसे हुई, लेकिन शायद यह बदल गया है
Sammaye

क्या होगा अगर मैं छँटाई कर रहा हूँ {a: -1, b: -1}, क्या मुझे {a: -1, b: -1}सूचकांक करना चाहिए या {a: 1, b: 1}पर्याप्त होगा।
हुसैन

@ अपने उदाहरण में {a: 1, b: 1}अनुक्रमणिका पर्याप्त होनी चाहिए क्योंकि एक सूचकांक पूरी तरह से ठीक है। उदाहरण के लिए, इंडेक्स पर {a: 1}एक प्रकार के लिए इस्तेमाल किया जा सकता है{a: -1}
जैद मसूद

12

इंडेक्स क्यों?

दो प्रमुख बिंदुओं को समझें।

  1. जबकि एक इंडेक्स किसी इंडेक्स से बेहतर नहीं है, लेकिन सही इंडेक्स या तो बहुत बेहतर है।
  2. MongoDB केवल एक इंडेक्स प्रति क्वेरी का उपयोग करेगा, जो उचित फ़ील्ड ऑर्डर के साथ कंपाउंड इंडेक्स बना रहा है जिसे आप शायद उपयोग करना चाहते हैं।

इंडेक्स मुफ्त नहीं हैं। वे मेमोरी लेते हैं, और आवेषण, अपडेट और हटाते समय एक प्रदर्शन जुर्माना लगाते हैं। आम तौर पर प्रदर्शन हिट नगण्य होता है (विशेष रूप से पढ़ने के प्रदर्शन में लाभ की तुलना में), लेकिन इसका मतलब यह नहीं है कि हम कुछ इंडेक्स बनाने के बारे में स्मार्ट नहीं हो सकते हैं।

कैसे सूचकांक

खेतों के किस समूह को एक साथ अनुक्रमित किया जाना चाहिए, यह पहचानना कि आपके द्वारा चलाए जा रहे प्रश्नों को समझना है। आपके अनुक्रमणिका को बनाने के लिए उपयोग किए गए फ़ील्ड का क्रम महत्वपूर्ण है। अच्छी खबर यह है कि, अगर आपको ऑर्डर गलत मिलता है, तो इंडेक्स का उपयोग बिल्कुल नहीं किया जाएगा, इसलिए स्पष्टीकरण के साथ हाजिर करना आसान होगा।

क्यों छंटनी हो रही है?

आपके प्रश्नों को क्रमबद्ध करने की आवश्यकता हो सकती है। लेकिन छंटनी एक महंगा ऑपरेशन हो सकता है, इसलिए उन फ़ील्ड्स का इलाज करना महत्वपूर्ण है जिन्हें आप किसी फ़ील्ड की तरह ही सॉर्ट कर रहे हैं जिसे आप क्वेरी कर रहे हैं। तो यह तेजी से होगा अगर इसमें सूचकांक है। हालांकि, एक महत्वपूर्ण अंतर यह है कि जिस क्षेत्र को आप छांट रहे हैं वह आपके सूचकांक में अंतिम क्षेत्र होना चाहिए। इस नियम का एकमात्र अपवाद यह है कि यदि फ़ील्ड आपकी क्वेरी का भी हिस्सा है, तो अंतिम-नियम लागू नहीं होना चाहिए।

कैसे छँटते हैं

आप इंडेक्स की सभी कुंजियों पर या एक सबसेट पर एक प्रकार निर्दिष्ट कर सकते हैं; हालाँकि, सॉर्ट कुंजी को उसी क्रम में सूचीबद्ध किया जाना चाहिए जैसा कि वे सूचकांक में दिखाई देते हैं। उदाहरण के लिए, एक इंडेक्स की पैटर्न {a: 1, b: 1} {a: 1, b: 1} पर एक प्रकार का समर्थन कर सकता है, लेकिन {b: 1, a: 1} पर नहीं।

सॉर्ट को इंडेक्स की पैटर्न के रूप में अपनी सभी कुंजियों के लिए समान सॉर्ट दिशा (यानी आरोही / अवरोही) निर्दिष्ट करनी चाहिए या इंडेक्स कुंजी पैटर्न के रूप में इसके सभी कुंजी के लिए रिवर्स सॉर्ट दिशा निर्दिष्ट करना चाहिए। उदाहरण के लिए, एक इंडेक्स की पैटर्न {a: 1, b: 1} {a: 1, b: 1} और {a: -1, b: -1} पर एक प्रकार का समर्थन कर सकता है, लेकिन {a: -1 पर नहीं। , बी: 1}।

मान लीजिए कि ये सूचकांक हैं:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

Example                                                    Index Used
db.data.find().sort( { a: 1 } )                            { a: 1 }
db.data.find().sort( { a: -1 } )                           { a: 1 }
db.data.find().sort( { a: 1, b: 1 } )                      { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } )                    { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } )                { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )   { a: 1, b: 1 }

मैं समझता हूं कि यह एक उदाहरण है लेकिन अगर सूचकांक है { a: 1, b: 1, c: 1 }तो क्या आपको वास्तव में सूचकांक की जरूरत है { a: 1}और { a: 1, b: 1}या सूचकांक { a: 1, b: 1, c: 1 }सभी मामलों को कवर करता है? यदि प्रश्न हमेशा एक ही प्रकार का उपयोग करते हैं: 1 -1 के साथ क्वेरी में कोई प्रकार नहीं है
लुकास लिसिस

1
यदि कई प्रश्न हैं जो केवल संपत्ति 'ए' पर काम कर रहे हैं, तो यह 3 इंजन 'ए', 'बी', 'सी' के साथ सूचकांक द्वारा खोजने की तुलना में डेटाबेस इंजन के लिए संपत्ति 'ए' के ​​साथ सूचकांक के साथ तेजी से खोज करना है। क्योंकि सूचकांक का आकार बढ़ेगा और गिनती भी बढ़ेगी। पूर्व। यदि पुस्तक में 20 अध्याय हैं। इसलिए अध्याय 3 और फिर विशिष्ट पृष्ठ पर जाना तेज़ है। @ लुकलाइसिस
सोमनाथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.