2012-10-23 12 views
7

मैं इस सरल उपसर्ग क्वेरी के साथ अटक गया हूं। हालांकि Mongo docs राज्य है कि आप उपसर्ग regex प्रारूप का उपयोग करके काफी अच्छा प्रदर्शन प्राप्त कर सकते हैं (/^एक /), क्वेरी बहुत धीमी है जब मैं परिणामों को सॉर्ट करने का प्रयास करें:रेजेक्स और सॉर्ट के साथ मोंगोड सरल उपसर्ग क्वेरी धीमी है

940 मिली सेकंड के

db.posts.find ({हैशटैग:/^ Noticias /})। सीमा (15) .sort ({रैंक: -1})।। संकेत ('hashtags_1_rank_ -1') की व्याख्या()

{ 
"cursor" : "BtreeCursor hashtags_1_rank_-1 multi", 
"isMultiKey" : true, 
"n" : 15, 
"nscannedObjects" : 142691, 
"nscanned" : 142692, 
"nscannedObjectsAllPlans" : 142691, 
"nscannedAllPlans" : 142692, 
"scanAndOrder" : true, 
"indexOnly" : false, 
"nYields" : 1, 
"nChunkSkips" : 0, 
"millis" : 934, 
"indexBounds" : { 
    "hashtags" : [ 
     [ 
      "noticias", 
      "noticiat" 
     ], 
     [ 
      /^noticias/, 
      /^noticias/ 
     ] 
    ], 
    "rank" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "XRTZ048.local:27017" 
} 

हालांकि, एक ही क्वेरी का अपरिवर्तित संस्करण सुपर फास्ट है:

0 मिली सेकंड के

db.posts.find।। ({हैशटैग:/^ Noticias /}) सीमा (15) .hint ('hashtags_1_rank_ -1') की व्याख्या()

{ 
"cursor" : "BtreeCursor hashtags_1_rank_-1 multi", 
"isMultiKey" : true, 
"n" : 15, 
"nscannedObjects" : 15, 
"nscanned" : 15, 
"nscannedObjectsAllPlans" : 15, 
"nscannedAllPlans" : 15, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 0, 
"indexBounds" : { 
    "hashtags" : [ 
     [ 
      "noticias", 
      "noticiat" 
     ], 
     [ 
      /^noticias/, 
      /^noticias/ 
     ] 
    ], 
    "rank" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "XRTZ048.local:27017" 

}

क्वेरी तेजी भी है अगर मैं regex और प्रकार निकालें:

0 मिली सेकंड के

db.posts.find ({हैशटैग: 'Noticias'}) सीमा (15) .sort ({रैंक: -1})।। संकेत ('hashtags_1_rank_ -1')। समझाने()

{ 
"cursor" : "BtreeCursor hashtags_1_rank_-1", 
"isMultiKey" : true, 
"n" : 15, 
"nscannedObjects" : 15, 
"nscanned" : 15, 
"nscannedObjectsAllPlans" : 15, 
"nscannedAllPlans" : 15, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 0, 
"indexBounds" : { 
    "hashtags" : [ 
     [ 
      "noticias", 
      "noticias" 
     ] 
    ], 
    "rank" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "XRTZ048.local:27017" 

}

यह दोनों regex का उपयोग कर की तरह लगता है और तरह मोंगो रिकॉर्ड के बहुत सारे स्कैन करता है। हालांकि, अगर मैं regex का उपयोग नहीं करता तो सॉर्ट केवल 15 स्कैनिंग कर रहा है। यहाँ क्या गलत है?

+1

जैम, मुझे विश्वास है कि 'स्कैन एंड ऑर्डर' 'धीमेपन के लिए ज़िम्मेदार है। आप [आंद्रे का जवाब] देखना चाहते हैं (http://stackoverflow.com/questions/11871187/removing-scanandorder-true-in-my-mongodb-query-result) जो समान हो सकता है यदि आपके जैसा बिल्कुल नहीं मुद्दा। – slee

उत्तर

6

scanAndOrder: true व्याख्या आउटपुट में इंगित करता है कि क्वेरी को पुनर्प्राप्त करने के लिए क्वेरी को पुनर्प्राप्त करना है और फिर आउटपुट लौटने से पहले उन्हें स्मृति में सॉर्ट करना है। यह एक महंगा ऑपरेशन है, और आपकी क्वेरी के प्रदर्शन पर असर पड़ेगा।

scanAndOrder: true के अस्तित्व के साथ ही समझाने उत्पादन में nscanned एक n में अंतर इंगित करता है कि क्वेरी एक इष्टतम सूचकांक का उपयोग नहीं कर रहा है। इस मामले में ऐसा लगता है कि संग्रह स्कैन करने की आवश्यकता है। आप अपने sort मानदंडों में इंडेक्स कुंजियों को शामिल करके इस समस्या को कम करने में सक्षम हो सकते हैं। मेरे परीक्षण से:

db.posts.find({hashtags: /^noticias/ }).limit(15).sort({hashtags:1, rank : -1}).explain() 

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

+0

धन्यवाद, वास्तव में यह चाल है।यह भी ध्यान देने योग्य है कि यदि आप एकाधिक जोड़ रहे हैं, तो सूचकांक सीमाओं को पहली नियमित अभिव्यक्ति से अनुमानित किया जाता है। उदाहरण के लिए, यह क्वेरी: 'db.posts.find ({" $ और ": [{हैशटैग:/^ मानाना /}, {हैशटैग: /^noticias/}]}).sort({'hashtags ': 1, 'रैंक': - 1})। सीमा (10) .explain() ' में मणाना पर सूचकांक सीमाएं होंगी, और इससे आपको अंतर प्रदर्शन हो सकता है। मेरे मामले में, नियमित अभिव्यक्ति प्रश्नों को क्रमबद्ध रूप से क्रमबद्ध रूप से बेहतर प्रदर्शन प्रदान किया गया – Darius

संबंधित मुद्दे