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

पहले मैच के चरण के बाद MongoDB कुल पाइपलाइन धीमी

2019 उत्तर

यह उत्तर MongoDB 4.2 के लिए है

प्रश्न और आप लोगों के बीच चर्चा को पढ़ने के बाद, मुझे विश्वास है कि समस्या हल हो गई है लेकिन फिर भी अनुकूलन उन सभी के लिए एक आम समस्या है जो MongoDB का उपयोग कर रहे हैं।

मुझे एक ही समस्या का सामना करना पड़ा, और यहां क्वेरी ऑप्टिमाइज़ेशन के लिए युक्तियां दी गई हैं।

अगर मैं गलत हूँ तो मुझे सुधारो :)

<मजबूत>1. संग्रह पर अनुक्रमणिका जोड़ें

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

आप अपनी जरूरत के हिसाब से अलग-अलग तरह के इंडेक्स बना सकते हैं। यहां अनुक्रमणिका के बारे में अधिक जानें, आधिकारिक MongoDB दस्तावेज़ीकरण।

<मजबूत>2. पाइपलाइन अनुकूलन

  • हमेशा $project से पहले $match का उपयोग करें , क्योंकि फ़िल्टर अगले चरण से अतिरिक्त दस्तावेज़ और फ़ील्ड हटा देते हैं।
  • हमेशा याद रखें, इंडेक्स का उपयोग $match और $sort द्वारा किया जाता है . इसलिए, उन फ़ील्ड में अनुक्रमणिका जोड़ने का प्रयास करें जिन पर आप दस्तावेज़ों को सॉर्ट या फ़िल्टर करने जा रहे हैं।
  • इस क्रम को अपनी क्वेरी में रखने का प्रयास करें, $limit से पहले $sort का उपयोग करें जैसे $सॉर्ट + $लिमिट + $स्किप। क्योंकि $sort अनुक्रमणिका का लाभ उठाता है और MongoDB को क्वेरी निष्पादित करते समय आवश्यक क्वेरी योजना का चयन करने की अनुमति देता है।
  • हमेशा $छोड़ने से पहले $limit का उपयोग करें ताकि दस्तावेज़ों को सीमित करने के लिए स्किप लागू किया जा सके।
  • $प्रोजेक्ट का उपयोग करें अगले चरण में केवल आवश्यक डेटा वापस करने के लिए।
  • $lookup में हमेशा विदेशी फ़ील्ड विशेषताओं पर एक अनुक्रमणिका बनाएं . साथ ही, जैसा कि लुकअप एक सरणी बनाता है, हम आम तौर पर इसे अगले चरण में खोलते हैं। इसलिए, अगले चरण में इसे खोलने के बजाय इसे लुकअप के अंदर खोल दें जैसे:

    {
    $lookup: {
        from: "Collection",
        as: "resultingArrays",
        localField: "x",
        foreignField: "y",
        unwinding: { preserveNullAndEmptyArrays: false }
    

    }}

  • डिस्क उपयोग की अनुमति दें . का उपयोग करें एकत्रीकरण में, इसकी सहायता से एकत्रीकरण संचालन डेटाबेस पथ निर्देशिका में _tmp उपनिर्देशिका में डेटा लिख ​​सकता है। इसका उपयोग अस्थायी निर्देशिका पर बड़ी क्वेरी करने के लिए किया जाता है। उदाहरण के लिए:

     db.orders.aggregate(
     [
            { $match: { status: "A" } },
            { $group: { _id: "$uid", total: { $sum: 1 } } },
            { $sort: { total: -1 } }
     ],
     {
            allowDiskUse: true
     },
     )
    

<मजबूत>3. अनुक्रमणिका का पुनर्निर्माण करें

यदि आप अक्सर अनुक्रमणिका बना रहे हैं और हटा रहे हैं तो अपनी अनुक्रमणिका का पुनर्निर्माण करें। यह MongoDB को ताज़ा करने में मदद करता है, कैश में पहले से संग्रहीत क्वेरी योजना, जो आवश्यक क्वेरी योजना को संभालती रहती है, मेरा विश्वास करो, वह समस्या बेकार है :(

<मजबूत>4. अवांछित अनुक्रमणिका निकालें

बहुत सी अनुक्रमणिकाएँ बनाएँ, अद्यतन करें और हटाएँ संचालन में बहुत अधिक समय लेती हैं क्योंकि उन्हें अपने कार्यों के साथ अनुक्रमणिका बनाने की आवश्यकता होती है। तो, उन्हें हटाने से बहुत मदद मिलती है।

<मजबूत>5. दस्तावेज़ सीमित करना

वास्तविक दुनिया के परिदृश्य में, डेटाबेस में मौजूद पूरा डेटा लाने से मदद नहीं मिलती है। साथ ही, या तो आप इसे प्रदर्शित नहीं कर सकते हैं या उपयोगकर्ता पूरा प्राप्त डेटा नहीं पढ़ सकता है। इसलिए, पूरा डेटा लाने के बजाय, डेटा को टुकड़ों में प्राप्त करें जो आपको और आपके क्लाइंट दोनों को उस डेटा को देखने में मदद करता है।

और अंत में MongoDB द्वारा चुनी गई निष्पादन योजना को देखने से मुख्य समस्या का पता लगाने में मदद मिलती है। इसलिए, $explain आपको इसका पता लगाने में मदद करेगा।

आशा है कि यह सारांश आप लोगों की मदद करेगा, यदि मुझसे कोई छूट गया है तो बेझिझक नए बिंदुओं का सुझाव दें। मैं उन्हें भी जोड़ दूंगा।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक ही मोंगोडब क्वेरी में गिनती और अलग गिनती के आधार पर समूह का चयन करें

  2. एक नोडज स्क्रिप्ट के भीतर एक मोंगो डेटाबेस में सभी संग्रह सूचीबद्ध करना

  3. नेवला डुप्लीकेट कुंजी त्रुटि upsert के साथ

  4. मोंगोडब से पांडा में डेटा कैसे आयात करें?

  5. ClusterControl के साथ शुरुआत कैसे करें