MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

मोंगोडीबी इंडेक्स को समझना

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

MongoDB इंडेक्स

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

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

संग्रह के लिए अनुक्रमणिका बनाना

यह मानते हुए कि आपने अपने संग्रह में कुछ डेटा डाला है और आप एक इंडेक्स होने के लिए एक फ़ील्ड असाइन करना चाहते हैं, आप इसे प्राप्त करने के लिए createIndex विधि का उपयोग कर सकते हैं, अर्थात

मान लें कि आपके पास यह json डेटा है:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

हम नाम फ़ील्ड को अवरोही अनुक्रमणिका बना सकते हैं:

db.collection.createIndex({Name: -1})

यह विधि समान विनिर्देश के साथ एक अनुक्रमणिका बनाती है यदि केवल पहले से ही अस्तित्व में नहीं है।

MongoDB में इंडेक्स के प्रकार

MongoDB में विभिन्न प्रकार के डेटा शामिल होते हैं इसलिए इन डेटा प्रकारों और प्रश्नों का समर्थन करने के लिए विभिन्न प्रकार के इंडेक्स प्राप्त होते हैं।

  1. एकल फ़ील्ड

    किसी दस्तावेज़ के एकल फ़ील्ड का उपयोग करके कोई भी ऊपर दिए गए उदाहरण की तरह फ़ील्ड को आरोही या अवरोही तरीके से एक अनुक्रमणिका बना सकता है। इसके अलावा, आप संपूर्ण रूप से एम्बेडेड दस्तावेज़ पर एक अनुक्रमणिका बना सकते हैं, उदाहरण के लिए:

    { 
        _id: “xyz”,
        Contact:{
            email: “example@sqldat.com”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    संपर्क फ़ील्ड एक एम्बेडेड दस्तावेज़ है इसलिए हम इसे कमांड के साथ आरोही सूचकांक बना सकते हैं:

    db.collection.createIndex({ Contact: 1})

    एक प्रश्न में हम दस्तावेज़ प्राप्त कर सकते हैं जैसे:

    db.collection.find({ 
        Contact: {email: “example@sqldat.com”,
        phone:”+420 78342823”} 
    })

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

  2. यौगिक अनुक्रमणिका

    कंपाउंड इंडेक्स का उपयोग अक्सर एक क्वेरी के भीतर सॉर्ट ऑपरेशन को सुविधाजनक बनाने और कई फ़ील्ड से मेल खाने वाले प्रश्नों का समर्थन करने के लिए किया जाता है। कंपाउंड इंडेक्स बनाने का सिंटैक्स है:

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    नीचे दिए गए नमूना डेटा के लिए एक मिश्रित अनुक्रमणिका बनाना

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    विचार:

    • केवल 32 फ़ील्ड की सीमा का समर्थन किया जा सकता है।
    • फ़ील्ड का मान इंडेक्स के प्रकार को परिभाषित करेगा यानी 1 आरोही है और -1 अवरोही है।
    • ऐसे कंपाउंड इंडेक्स न बनाएं जिनमें हैशेड इंडेक्स टाइप हो।
    • यौगिक अनुक्रमणिका में सूचीबद्ध फ़ील्ड का क्रम महत्वपूर्ण है। छँटाई खेतों के क्रम के अनुसार की जाएगी।
  3. मल्टीकी इंडेक्स

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

    मल्टीकी इंडेक्स की सीमाएं

    • संग्रह में किसी दस्तावेज़ के लिए बहु-कुंजी अनुक्रमण में केवल एक सरणी फ़ील्ड का उपयोग किया जा सकता है। अर्थात। आप
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      आप एक बहु-कुंजी अनुक्रमणिका नहीं बना सकते
      { nums: 1, scores: 1 } 
    • यदि बहुकुंजी अनुक्रमणिका पहले से मौजूद है, तो आप इस प्रतिबंध का उल्लंघन करने वाले दस्तावेज़ को सम्मिलित नहीं कर सकते। इसका मतलब यह है कि अगर हमारे पास
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      एक मिश्रित बहुकुंजी अनुक्रमणिका बनाने के बाद, एक दस्तावेज़ सम्मिलित करने का प्रयास जहाँ अंक और स्कोर दोनों फ़ील्ड सरणियाँ हैं, डेटाबेस सम्मिलित करने में विफल हो जाएगा।
  4. पाठ अनुक्रमणिका

    टेक्स्ट इंडेक्स का उपयोग अक्सर संग्रह में एक स्ट्रिंग के लिए खोज क्वेरी में सुधार करने के लिए किया जाता है। वे भाषा-विशिष्ट स्टॉप शब्द (यानी "द", "ए", "या") संग्रहीत नहीं करते हैं। एक संग्रह में अधिकतम एक टेक्स्ट इंडेक्स हो सकता है। टेक्स्ट इंडेक्स बनाने के लिए:

    db.collection.createIndex({Name:”text”})

    आप कई क्षेत्रों को भी अनुक्रमित कर सकते हैं अर्थात

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    एक मिश्रित अनुक्रमणिका में आरोही/अवरोही अनुक्रमणिका कुंजी के संयोजन में एक पाठ अनुक्रमणिका कुंजी शामिल हो सकती है लेकिन:

    • कंपाउंड टेक्स्ट इंडेक्स बनाते समय सभी टेक्स्ट इंडेक्स कुंजियां इंडेक्स विनिर्देश दस्तावेज़ में साथ-साथ होनी चाहिए।
    • कोई अन्य विशेष अनुक्रमणिका प्रकार जैसे बहुकुंजी अनुक्रमणिका फ़ील्ड को मिश्रित पाठ अनुक्रमणिका में शामिल नहीं किया जाना चाहिए।
    • $पाठ खोज करने के लिए, क्वेरी विधेय में पूर्ववर्ती कुंजियों पर समानता मिलान शर्तें शामिल होनी चाहिए।
  5. हैश इंडेक्स

    साझाकरण क्षैतिज स्केलिंग में सुधार के लिए MongoDB में उपयोग की जाने वाली तकनीकों में से एक है। साझाकरण में अक्सर हैश आधारित अवधारणा शामिल होती है जो हैशेड इंडेक्स के उपयोग से होती है। उनकी श्रेणी के साथ मूल्यों का अधिक यादृच्छिक वितरण इन अनुक्रमणिकाओं द्वारा चित्रित किया जाता है, लेकिन केवल समानता मिलान का समर्थन करता है और श्रेणी-आधारित प्रश्नों का समर्थन नहीं कर सकता है।

इंडेक्स के लिए समग्र परिचालन संबंधी विचार

  • प्रत्येक अनुक्रमणिका को कम से कम 8kB डेटा स्थान की आवश्यकता होती है।
  • सक्रिय होने पर, प्रत्येक अनुक्रमणिका कुछ डिस्क स्थान और मेमोरी का उपभोग करेगी। क्षमता नियोजन में ट्रैक किए जाने पर यह महत्वपूर्ण है।
  • एक उच्च पढ़ने-से-लिखने के अनुपात संग्रह के लिए, अतिरिक्त अनुक्रमणिका प्रदर्शन में सुधार करती हैं और गैर-अनुक्रमित पठन संचालन को प्रभावित नहीं करती हैं।

इंडेक्स के उपयोग की सीमाएं

  • सूचकांक जोड़ने से विशेष रूप से उच्च लिखने-पढ़ने के अनुपात वाले संग्रह के लिए लेखन कार्यों के लिए कुछ नकारात्मक प्रदर्शन प्रभाव पड़ता है। इंडेक्स महंगे होंगे क्योंकि प्रत्येक इंसर्ट को किसी इंडेक्स को भी अपडेट करना होगा।
  • यदि किसी मौजूदा दस्तावेज़ के लिए अनुक्रमणिका प्रविष्टि अनुक्रमणिका कुंजी सीमा से अधिक है, तो MongoDB कोई अनुक्रमणिका नहीं बनाएगा, अद्यतन नहीं करेगा या अनुक्रमित संग्रह में सम्मिलित नहीं करेगा।
  • मौजूदा शार्प किए गए संग्रहों के लिए, चंक माइग्रेशन विफल हो जाएगा यदि चंक में एक ऐसा दस्तावेज़ है जिसमें एक अनुक्रमित फ़ील्ड है जिसमें एक अनुक्रमणिका प्रविष्टि है जो अनुक्रमणिका कुंजी सीमा से अधिक है।

निष्कर्ष

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


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नोड + नेवला:अंतिम डाली गई आईडी प्राप्त करें?

  2. नेवला वैकल्पिक खोज क्वेरी पैरामीटर?

  3. मैं MongoDB के लिए फ़ील्ड-स्तरीय अनुमतियाँ कैसे लागू कर सकता हूँ?

  4. मोंगोडब में एन दस्तावेजों की संख्या कैसे हटाएं

  5. Cosmos MongoDB एकीकरण के साथ Azure फ़ंक्शन सहेज नहीं रहा है