2011-10-11 8 views
17

यदि मैं शैल से एक मोंगो क्वेरी को समझाने के साथ चलाता हूं(), इस्तेमाल किए गए इंडेक्स का नाम प्राप्त करें और फिर उसी क्वेरी को दोबारा चलाएं, लेकिन संकेत() के साथ उसी इंडेक्स को निर्दिष्ट करने के लिए निर्दिष्ट करें - "मिलिस" फ़ील्ड समझाए जाने से योजना काफीमोंगो संकेत एक क्वेरी को 10 गुना तेजी से क्यों चलाता है?

उदाहरण के लिए कम हो जाती है

कोई संकेत प्रदान की:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).explain(); 

{ 
    "cursor" : "BtreeCursor my_super_index", 
    "nscanned" : 599, 
    "nscannedObjects" : 587, 
    "n" : 3, 
    "millis" : 24, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { ... } 
} 

संकेत प्रदान की:

>>db.event.find({ "type" : "X", "active" : true, "timestamp" : { "$gte" : NumberLong("1317498259000") }, "count" : { "$gte" : 0 } }).limit(3).sort({"timestamp" : -1 }).hint("my_super_index").explain(); 

{ 
    "cursor" : "BtreeCursor my_super_index", 
    "nscanned" : 599, 
    "nscannedObjects" : 587, 
    "n" : 3, 
    "millis" : 2, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : true, 
    "indexOnly" : false, 
    "indexBounds" : { ... } 
} 

एकमात्र अंतर "मिलिस" फ़ील्ड

क्या किसी को पता है कि वह क्यों है?

अद्यतन: "कौन सी अनुक्रमणिका का उपयोग करना है" का चयन नहीं करता है, क्योंकि जहां तक ​​मुझे पता है, मोंगो, प्रत्येक एक्स (100?) रनों के लिए इंडेक्स का चयन करता है, इसलिए यह अगले संकेत के साथ जितना तेज़ होना चाहिए (एक्स -1) रन

+3

या तो सूचकांक चीजों को इतना तेज है, या आप बस एक कैश्ड क्वेरी, जो बहुत ज्यादा बहुत कम भूमि के ऊपर है फिर से क्रियान्वित कर रहे हैं। –

+0

मुझे नहीं लगता कि यह कैशिंग के कारण है। यदि मैं 2, 3 या 10 बार संकेत के बिना एक ही क्वेरी चलाता हूं तो यह बहुत तेज़ नहीं होगा, लेकिन यह हमेशा संकेत के साथ महत्वपूर्ण रूप से तेज़ी से बढ़ता है। –

+0

क्या आप अपना प्रश्न संपादित कर सकते हैं ताकि खोजने के आउटपुट (...) को शामिल किया जा सके। संकेत के बिना समझाएं (सत्य)। वह अतिरिक्त जानकारी प्रिंट करेगा जो इसे डीबग करने में मदद कर सकता है। – mstearn

उत्तर

17

मोंगो निर्धारित करने के लिए जब कोई संकेत प्रदान की जाती है जो सूचकांक में इस्तेमाल किया जा करने के लिए एक एल्गोरिथ्म का उपयोग करता है और फिर कैश अगले 1000 के लिए समान क्वेरी के लिए इस्तेमाल किया सूचकांक कॉल

लेकिन जब भी आप एक मोंगो क्वेरी समझाने यह हमेशा चलेंगे सूचकांक चयन एल्गोरिदम, इस प्रकार संकेत के साथ व्याख्या() संकेत के बिना व्याख्या() के साथ तुलना में हमेशा कम समय लेगा।

इसी प्रकार के प्रश्न का यहां उत्तर था Understanding mongo db explain

+0

उचित लगता है। क्या आपके पास दस्तावेज़ीकरण के लिए कोई संदर्भ है? –

+0

http://stackoverflow.com/questions/12510974/understanding-mongo-db-explain –

+2

"इसके अतिरिक्त, $ समझाया गया ऑपरेशन उम्मीदवार क्वेरी योजनाओं के एक सेट का पुनर्मूल्यांकन करता है, जो $ सामान्य क्वेरी से अलग प्रदर्शन करने के लिए $ नतीजतन, ये ऑपरेशंस आमतौर पर एक सटीक खाता प्रदान करते हैं कि कैसे मोंगोडीबी क्वेरी करेगा, लेकिन इन प्रश्नों की लंबाई को प्रतिबिंबित न करें। जब आप संकेत() के साथ समझाते हैं(), क्वेरी ऑप्टिमाइज़र पुनर्मूल्यांकन नहीं करता है क्वेरी योजनाएं। " http://docs.mongodb.org/manual/reference/operator/explain/#op._S_explain से निकाला गया –

6

मोंगो ने स्कैन की गई वस्तुओं की संख्या से दोनों बार एक ही खोज की थी। साथ ही आप देख सकते हैं कि प्रयुक्त सूचकांक वही था ("कर्सर" प्रविष्टि पर एक नज़र डालें), दोनों पहले से ही आपके my_super_index अनुक्रमणिका का उपयोग करते हैं।

"संकेत" केवल मोंगो को उस विशिष्ट अनुक्रमणिका का उपयोग करने के लिए कहता है जो पहले से ही पहले क्वेरी में स्वचालित रूप से किया गया था।

दूसरी खोज सरल तेज़ी से थी क्योंकि सभी डेटा शायद पहले से ही कैश में था।

+1

यह बिल्कुल सही है। आपकी पहली क्वेरी अब चल रही है क्योंकि यह पृष्ठ डिस्क से डेटा को गलती और लोड करता है। इस तरह के कुछ परीक्षणों के परीक्षण के लिए, आपको इसे विभिन्न प्रकार की विभिन्न परिस्थितियों में हजारों बार चलाने की ज़रूरत है, इसके उत्पादन के भार के समान ही सटीक बेंचमार्क तक पहुंचने के लिए परिणाम औसत होंगे। – marr75

+0

एक नोट, हालांकि, डेटा "कैश" में अधिकतर नहीं है, डेटाबेस फ़ाइलों को मेमोरी मैप किया गया है और इसे पहले ही सिस्टम मेमोरी में लोड किया गया है। मोंगो मेमोरी मैपिंग द्वारा फ़ाइलों को सरल रखता है और ऑपरेटिंग सिस्टम को पृष्ठों को स्वैप करने का निर्णय लेता है, लगभग हमेशा आवृत्ति और पहुंच की पुनरावृत्ति पर आधारित होता है। – marr75

+0

मेरा अद्यतन अनुभाग देखें –

2

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

+0

बस समझने योग्य उत्तर –

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