2012-02-20 20 views
9

के बिना mongodb क्वेरी प्रदर्शन की जांच कैसे कर सकता हूं मेरे पास एक क्वेरी है जो समाप्त होने में बहुत अधिक समय लेती है। मुझे कुछ प्रदर्शन परीक्षण करना पसंद है लेकिन जब मैं एक बार जांचता हूं (जो वर्तमान में ~ 30 सेकंड लेता है) क्वेरी बहुत तेजी से चलने लगती है (< 1 सेकंड)। मुझे लगता है कि इसे मोंगोड कैशिंग के साथ होना चाहिए। क्या मोंगोडब के लिए कैशिंग अक्षम करने का कोई तरीका है या किसी अन्य तरीके से मैं प्रदर्शन की जांच कर सकता हूं?मैं कैश

मैं mongohq में होस्ट किया गया mongodb का उपयोग कर रहा हूँ।

{"cursor"=>"BtreeCursor start_-1", "nscanned"=>5276, "nscannedObjects"=>5276, "n"=>25, "millis"=>3264, "nYields"=>0, "nChunkSkips"=>0, "isMultiKey"=>false, "indexOnly"=>false, "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}, "allPlans"=>[{"cursor"=>"BtreeCursor attendees_count_-1", "indexBounds"=>{"attendees_count"=>[[1.7976931348623157e+308, 1]]}}, {"cursor"=>"BtreeCursor images_count_-1", "indexBounds"=>{"images_count"=>[[1.7976931348623157e+308, 2]]}}, {"cursor"=>"BtreeCursor start_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor start_-1_end_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]], "end"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor attendees._id_1 multi", "indexBounds"=>{"attendees._id"=>[[BSON::ObjectId('4f0b621e94bb688563000007'),BSON::ObjectId('4f0b621e94bb688563000007')], [BSON::ObjectId('4f0b647d5a8c00acde05236f'), BSON::ObjectId('4f0b647d5a8c00acde05236f')], [BSON::ObjectId('4f0b647d5a8c00acde052370'), BSON::ObjectId('4f0b647d5a8c00acde052370')], [BSON::ObjectId('4f0b647d5a8c00acde052371'), BSON::ObjectId('4f0b647d5a8c00acde052371')], [BSON::ObjectId('4f0b647d5a8c00acde052372'), BSON::ObjectId('4f0b647d5a8c00acde052372')], [BSON::ObjectId('4f0b647d5a8c00acde052373') ... (lots of Object IDs)]]}}} 

सूचना है कि मैं समझाने के कुछ काटना क्योंकि यह बहुत लंबा था: रूबी ऑन रेल्स 3. यहाँ के साथ कार्यक्रम की व्याख्या है। जहां "ऑब्जेक्ट आईडी के बहुत सारे" हैं वहां बहुत सारी ऑब्जेक्ट आईडी (~ 400) थीं। सभी

धन्यवाद

उत्तर

2

आप पहली बार क्वेरी चलाने कर रहे हैं, डेटा सेट स्मृति मैप की गई है, लेकिन वास्तविक स्मृति में पृष्ठांकित नहीं किया गया है, MongoDB साइट पर Caching देखते हैं। इसलिए, ओएस को उस पृष्ठ को याद रखना है जो डेटा को स्मृति में सेट करता है और फिर आपको अपना क्वेरी रन और परिणाम मिलता है।

क्योंकि आप डिस्क (धीमी) से रैम (तेज़) में पेजिंग कर रहे हैं, प्रारंभिक रन धीमा है, और तब तक, जब तक आपके पास मेमोरी प्रेशर न हो, वह डेटा रैम में रहेगा और उस डेटा पर आपके सभी प्रश्न सेट तेज होगा।

इस प्रकार मोंगोडीबी को काम करने के लिए डिज़ाइन किया गया है, तो आपके डेटा सेट को स्मृति में लोड करने की प्रक्रिया को अक्सर डेटाबेस को "वार्मिंग अप" कहा जाता है और यह केवल उस गर्म होने के बाद होता है (आपके मामले में पहली क्वेरी) जो आपको मिलता है सही प्रदर्शन।

यह ध्यान देने योग्य है कि आपकी प्रारंभिक क्वेरी को अभी भी वापस आने में बहुत लंबा समय लगता है। आपको यह सुनिश्चित करना चाहिए कि यह इंडेक्स प्रभावी ढंग से उपयोग कर रहा है। उस जांच में शुरू करने के लिए सबसे अच्छी जगह explain() पृष्ठ है।

+0

मैं अभी भी अपने प्रारंभिक क्वेरी तेजी क्योंकि मैं याद करने के लिए सभी दस्तावेजों लोड नहीं कर सकता चलाना चाहते हैं। इसलिए, मैंने पहले से ही व्याख्या का उपयोग किया है, और देखा है कि यह क्वेरी लाने के लिए ~ 5000 दस्तावेज़ स्कैन करता है और मुझे लगता है कि 5000 दस्तावेज़ों के लिए 30 सेकंड बहुत अधिक हैं। यही कारण है कि मैं कैश के बिना एक ही प्रश्न करना जारी रखना चाहता हूं ताकि मैं गलत जांच न कर सकूं। – Gluz

+0

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

+0

मूल संदेश में जोड़ा गया। – Gluz