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

MongoDB रेगेक्स, सूचकांक और प्रदर्शन

MongoDB $regex ऑपरेटर का उपयोग करके नियमित अभिव्यक्तियों का समर्थन करता है। हालांकि इन MongoDB रेगेक्स प्रश्नों में एक नकारात्मक पहलू है,  एक प्रकार के रेगेक्स को छोड़कर सभी इंडेक्स का खराब उपयोग करते हैं और इसके परिणामस्वरूप प्रदर्शन समस्याएं होती हैं। बड़ी मात्रा में डेटा वाले उत्पादन सर्वर के लिए, एक खराब रेगेक्स क्वेरी आपके सर्वर को घुटनों पर ला सकती है।

मोंगोडीबी रेगेक्स आधारित प्रश्न मोंगोडीबी का उपयोग करने वाले अधिकांश अनुप्रयोगों में काफी सामान्य प्रश्न हैं। यह अधिकांश रिलेशनल डेटाबेस पर समर्थित 'LIKE' ऑपरेशन के समान है। कमांड का सिंटैक्स इस प्रकार है

{ $regex: /pattern/, $options: '<options>' }
E.g. { name: { $regex: /^acme.*test/}}

रेगेक्स संचालन और अतिरिक्त विकल्पों के बारे में अधिक विस्तृत जानकारी के लिए MongoDB दस्तावेज़ देखें

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

उदा. { नाम: { $regex: /^acme/}}

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

आइए कुछ उदाहरण और परिणामी क्वेरी योजनाओं को देखें। हमारे परीक्षण उद्देश्यों के लिए मैंने 100k दस्तावेज़ों के साथ एक संग्रह स्थापित किया है। प्रत्येक दस्तावेज़ में एक प्रथम नाम फ़ील्ड होता है जो एक 16 वर्ण स्ट्रिंग होता है।

उदाहरण 1: { नाम:{ $regex:/^acme/}}
परिणाम :कुशल अनुक्रमणिका उपयोग
क्वेरी योजना:

executionStats" : {
       "executionSuccess" : true,
       "nReturned" : 0,
       "executionTimeMillis" : 0,
       "totalKeysExamined" : 1,
       "totalDocsExamined" : 0,

उदाहरण 2: { नाम:{ $regex:/^acme/i}}
परिणाम :केस असंवेदनशील आवश्यकता के कारण अक्षम इंडेक्स स्कैन। तो मूल रूप से /i विकल्प "उपसर्ग अभिव्यक्ति" को नकारता है
क्वेरी योजना:

        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 137,
                "totalKeysExamined" : 100000,
                "totalDocsExamined" : 0,

उदाहरण 3: { नाम:{ $regex:/acme.*corp/}}
परिणाम :अक्षम अनुक्रमणिका स्कैन
क्वेरी योजना:

                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 167,
                "totalKeysExamined" : 100000,
                "totalDocsExamined" : 0,

उदाहरण 4: { नाम:{ $regex:/acme/}}
परिणाम :अक्षम अनुक्रमणिका स्कैन

        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 130,
                "totalKeysExamined" : 100000,
                "totalDocsExamined" : 0,

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. उल्का मोंगो अद्यतन नेस्टेड सरणी

  2. Docker . में node.js के माध्यम से MongoDB से कनेक्ट नहीं हो सकता

  3. MongoDB प्रदर्शन-वार में कंपाउंड इंडेक्स का क्रम कैसे मायने रखता है?

  4. MongoDB - किसी सरणी के अंतिम तत्व पर क्वेरी?

  5. MongoDB बैच ऑपरेशन अधिकतम आकार क्या है?