2011-06-21 8 views
8

मैं निम्न स्थितियों में डेटाबेस प्रदर्शन को बेहतर बनाने के तरीकों की तलाश में हूं।MongoDB में अद्यतन() और save() के प्रदर्शन में सुधार कैसे करें?

नमूना आवेदन के रूप में, मैंने आज एक काफी सरल ऐप लिखा है जो कुछ खोजशब्दों की खोज के लिए ट्विटर स्ट्रीमिंग एपीआई का उपयोग करता है, तो मैं परिणाम MongoDB में संग्रहीत कर रहा हूं। ऐप Node.js. के साथ लिखा गया है

मैं 2 संग्रह संग्रहीत कर रहा हूं। कोई कीवर्ड और ट्वीट ट्वीट की एक सरणी संग्रहीत करता है जो उस ट्वीट का उल्लेख करते हुए प्रत्येक ट्वीट को संदर्भित करता है। इन्हें {अपर्ट: सत्य} के साथ .update() का उपयोग करके डेटाबेस में जोड़ा जा रहा है ताकि नई आईडी को 'आईडी' सरणी में जोड़ा जा सके।

इस संग्रह से एक नमूना दस्तावेज़ इस तरह दिखता है:

{ "_ id": ObjectId ("4e00645ef58a7ad3fc9fd9f9"), "ids": [ "ID1", "आईडी 2", "id3"], "कीवर्ड": "#chocolate" }

अद्यतन कोड:

keywords.update({keyword: key_word},{$push:{ids: id}},{upsert:true}, function(err){}) 

2 संग्रह इस तरह दिखता है और .save का उपयोग करके बस जोड़ रहे हैं()

{ 
    "twt_id": "id1", 
    "tweet": { //big chunk of json that doesn't need to be shown } 
} 

मुझे यह अभी मेरी मैकबुक पर चल रहा है और यह लगभग 2 घंटे तक जा रहा है। मैं डेटा के लॉट संग्रहीत कर रहा हूं, शायद प्रति सौ सौ दस्तावेज़। अभी मोंगोड में वस्तुओं की संख्या 120k + है।

जो मैं देख रहा हूं वह यह है कि डेटाबेस प्रक्रिया के लिए सीपीयू उपयोग 84% जितना ऊंचा हो रहा है और मैंने हाल ही में परीक्षण शुरू करने के बाद लगातार धीरे-धीरे बढ़ रहा है।

मैं इंडेक्स सेट करने पर पढ़ रहा था, लेकिन चूंकि मैं दस्तावेज़ जोड़ रहा हूं और उनके खिलाफ प्रश्न नहीं चला रहा हूं, मुझे यकीन नहीं है कि इंडेक्स मदद करेगा या नहीं। एक पक्ष ने सोचा कि मेरे साथ हुआ यह है कि अपडेट() एक लुकअप कर रहा है क्योंकि मैं $ पुश का उपयोग कर रहा हूं और यह कि एक सूचकांक उसमें मदद कर सकता है।

मुझे मोंगोडीबी को लगातार बढ़ती मात्रा में सीपीयू खाने से क्या देखना चाहिए?

+1

एक एक धीमी गति से डिस्क के साथ मैकबुक में ट्वीट की आईडी डालें संभावना नहीं है बेंचमार्क प्रदर्शन और @Blackmoon स्वीकार किए जाते हैं नवीनतम मैकबुक हार्डवेयर –

+0

साथ प्रदर्शन problems..even की बात के लिए सही विकल्प उत्तर अन्यथा सुझाता है। – hplbsh

उत्तर

6

आप सही रास्ते पर हैं। आपके अपडेट के क्वेरी भाग को एक इंडेक्स की आवश्यकता है, अन्यथा यह एक टेबल स्कैन चला रहा है। कीवर्ड पर एक इंडेंट इंडेक्स और आप अपडेट प्रदर्शन में उल्लेखनीय वृद्धि देखेंगे।

+0

यदि आप न केवल ऑफ़लाइन पूर्ण तालिका स्कैन प्रोसेसिंग की योजना बनाते हैं तो आपको अपनी सभी इंडेक्स को खोजों के लिए जोड़ना चाहिए ताकि आप आवेषण के व्यावहारिक प्रदर्शन को माप सकें। –

+0

धन्यवाद ब्रेंडन। इस पर वापस आने के लिए मुझे कुछ दिन लगे। मैंने सीपीयू का बैक अप लेने के लिए एक अच्छे घंटे के लिए ऐप चलाया। मैंने ऐप को रोक दिया, इंडेक्स जोड़ा, और फिर से शुरू किया। अब मोंगो 1.0-1.4% सीपीयू का उपयोग कर रहा है। मुझे यह देखने के लिए थोड़ी देर के लिए दौड़ना है कि दीर्घकालिक प्रदर्शन क्या है, लेकिन यह एक बड़ा लाभ था। धन्यवाद। – Geuis

9

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

इंडेक्स जोड़ना केवल लेखन प्रदर्शन को नुकसान पहुंचा सकता है ताकि जब तक आप भारी पढ़ न जाएं तब तक प्रदर्शन में सुधार करने में मदद नहीं मिलेगी।

मैं अपने आवेदन तर्क को बदलना यह करने के लिए विचार किया जाएगा: कीवर्ड क्षेत्र

  • पर

    1. सूचकांक डेटाबेस में हर बार जब आप एक ट्वीट का पता लगाने के लिए कुछ भी डालने से पहले, दस्तावेज़ के लिए क्वेरी कीवर्ड शामिल है जो ।यदि यह अस्तित्व में नहीं है, तो एक नया दस्तावेज़ डालें लेकिन सरणी में नकली तारों का एक पूरा समूह जोड़कर ids संपत्ति पैड करें। फिर इसे डालने के तुरंत बाद, उस सरणी से सभी आईडी को हटा दें। इससे मोंगोडब को पूरे दस्तावेज़ के लिए अतिरिक्त कमरे आवंटित करने का कारण मिलेगा ताकि जब आप आईडी के क्षेत्र में आईडी जोड़ना शुरू कर दें, तो इसमें बढ़ने के लिए बहुत सारे कमरे होंगे।
    2. ids क्षेत्र
  • +1

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

    +0

    @ pestilence669 मैंने सोचा कि पैडिंग कारक गतिशील रूप से गणना की जाती है - आप इसे सेट नहीं कर सकते हैं। क्या आप एक रास्ता जानते हैं? – spektom

    +0

    @ स्पीक्टॉम दाएं, जो मैं व्हाइटस्पेस या ऐसे कुछ जंक डेटा के साथ एक कस्टम पैडिंग कारक अनुकरण करने का सुझाव दे रहा था – pestilence669

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