मैं आपको अपने वैश्विक ज्ञान और अनुभव के आधार पर कुछ संकेत देता हूं:
छोटे फ़ील्ड नामों का उपयोग करें
MongoDB प्रत्येक दस्तावेज़ के लिए समान कुंजी संग्रहीत करता है। यह पुनरावृत्ति एक बढ़ी हुई डिस्क स्थान का कारण बनती है। यह आपके जैसे बहुत बड़े डेटाबेस पर कुछ प्रदर्शन समस्या हो सकती है।
पेशेवरों:
- दस्तावेज़ों का कम आकार, इतना कम डिस्क स्थान
- RAM में फ़िट होने के लिए अधिक दस्तावेज़ (अधिक कैशिंग)
- डू इंडेक्स का आकार कुछ परिदृश्य में कम होगा
विपक्ष:
- कम पठनीय नाम
सूचकांक आकार पर अनुकूलित करें
इंडेक्स का आकार जितना छोटा होता है, उतना ही यह रैम में फिट हो जाता है और इंडेक्स मिस कम हो जाता है। उदाहरण के लिए git कमिट के लिए SHA1 हैश पर विचार करें। एक git कमिट को कई बार पहले 5-6 वर्णों द्वारा दर्शाया जाता है। फिर केवल सभी हैश के बजाय 5-6 वर्णों को संग्रहीत करें।
पैडिंग फ़ैक्टर को समझें
दस्तावेज़ में होने वाले अपडेट के लिए महंगा दस्तावेज़ स्थानांतरित हो रहा है। यह दस्तावेज़ पुराने दस्तावेज़ को हटाने और इसे एक नए खाली स्थान पर अपडेट करने और इंडेक्स को अपडेट करने का कारण बनता है जो महंगा है।
हमें यह सुनिश्चित करने की आवश्यकता है कि यदि कुछ अपडेट होता है तो दस्तावेज़ हिलता नहीं है। प्रत्येक संग्रह के लिए एक पैडिंग कारक शामिल होता है जो बताता है कि दस्तावेज़ डालने के दौरान वास्तविक दस्तावेज़ आकार के अलावा कितना अतिरिक्त स्थान आवंटित किया जाना है।
आप संग्रह पैडिंग कारक का उपयोग करके देख सकते हैं:
db.collection.stats().paddingFactor
मैन्युअल रूप से पैडिंग जोड़ें
आपके मामले में आप एक छोटे से दस्तावेज़ के साथ शुरुआत करना सुनिश्चित कर रहे हैं जो बढ़ेगा। कुछ समय बाद अपने दस्तावेज़ को अपडेट करने से कई दस्तावेज़ स्थानांतरित हो जाएंगे। तो बेहतर होगा कि दस्तावेज़ के लिए एक पैडिंग जोड़ें। दुर्भाग्य से, पैडिंग जोड़ने का कोई आसान तरीका नहीं है। हम इन्सर्ट करते समय कुछ कुंजी में कुछ रैंडम बाइट्स जोड़कर ऐसा कर सकते हैं और फिर अगले अपडेट क्वेरी में उस कुंजी को हटा सकते हैं।
अंत में, यदि आप सुनिश्चित हैं कि भविष्य में दस्तावेज़ों में कुछ कुंजियाँ आ जाएँगी, तो उन कुंजियों को कुछ डिफ़ॉल्ट मानों के साथ पूर्व-आवंटित करें ताकि आगे के अद्यतनों के कारण दस्तावेज़ के आकार में वृद्धि न हो जिससे दस्तावेज़ स्थानांतरित हो जाए।
आप दस्तावेज़ को स्थानांतरित करने वाली क्वेरी के बारे में विवरण प्राप्त कर सकते हैं:
db.system.profile.find({ moved: { $exists : true } })
बड़ी संख्या में संग्रह बनाम कुछ संग्रह में बड़ी संख्या में दस्तावेज़
स्कीमा कुछ ऐसा है जो आवेदन आवश्यकताओं पर निर्भर करता है। यदि कोई विशाल संग्रह है जिसमें हम केवल नवीनतम N दिनों के डेटा की क्वेरी करते हैं, तो हम वैकल्पिक रूप से अलग संग्रह करना चुन सकते हैं और पुराने डेटा को सुरक्षित रूप से संग्रहीत किया जा सकता है। यह सुनिश्चित करेगा कि RAM में कैशिंग ठीक से की गई है।
बनाए गए प्रत्येक संग्रह में एक लागत होती है जो संग्रह बनाने की लागत से अधिक होती है। प्रत्येक संग्रह का न्यूनतम आकार होता है जो कुछ KB + एक अनुक्रमणिका (8 KB) होता है। प्रत्येक संग्रह में एक नामस्थान जुड़ा होता है, डिफ़ॉल्ट रूप से हमारे पास कुछ 24K नामस्थान होते हैं। उदाहरण के लिए, प्रति उपयोगकर्ता संग्रह रखना एक बुरा विकल्प है क्योंकि यह स्केलेबल नहीं है। कुछ समय बाद Mongo हमें अनुक्रमणिका के नए संग्रह बनाने की अनुमति नहीं देगा।
आम तौर पर कई संग्रह होने पर कोई महत्वपूर्ण प्रदर्शन दंड नहीं होता है। उदाहरण के लिए, हम प्रति माह एक संग्रह करना चुन सकते हैं, यदि हम जानते हैं कि हम हमेशा महीनों के आधार पर पूछताछ कर रहे हैं।
डेटा का असामान्यकरण
यह हमेशा एक ही डिस्क स्थान में एक क्वेरी या प्रश्नों के अनुक्रम के लिए सभी संबंधित डेटा रखने की सिफारिश की जाती है। आपको विभिन्न दस्तावेज़ों में जानकारी को डुप्लिकेट करने की आवश्यकता है। उदाहरण के लिए, किसी ब्लॉग पोस्ट में, आप पोस्ट की टिप्पणियों को पोस्ट दस्तावेज़ में संग्रहीत करना चाहेंगे।
पेशेवरों:
- सूचकांक का आकार बहुत कम होगा क्योंकि अनुक्रमणिका प्रविष्टियों की संख्या कम होगी
- क्वेरी बहुत तेज़ होगी जिसमें सभी आवश्यक विवरण प्राप्त करना शामिल है
- दस्तावेज़ का आकार पृष्ठ आकार के बराबर होगा जिसका अर्थ है कि जब हम इस डेटा को RAM में लाते हैं, तो अधिकांश समय हम पृष्ठ के साथ अन्य डेटा नहीं ला रहे होते हैं
- दस्तावेज़ स्थानांतरण यह सुनिश्चित करेगा कि हम एक पृष्ठ को मुक्त कर रहे हैं, न कि पृष्ठ में एक छोटा सा छोटा सा हिस्सा जो आगे की प्रविष्टियों में उपयोग नहीं किया जा सकता है
कैप्ड संग्रह
कैप्ड संग्रह सर्कुलर बफर की तरह व्यवहार करता है। वे विशेष प्रकार के निश्चित आकार के संग्रह हैं। ये संग्रह बहुत उच्च गति के लेखन और अनुक्रमिक पठन प्राप्त कर सकते हैं। निश्चित आकार होने के कारण आवंटित स्थान भर जाने के बाद पुराने दस्तावेजों को हटाकर नए दस्तावेज लिखे जाते हैं। हालांकि दस्तावेज़ अपडेट की अनुमति केवल तभी दी जाती है जब अपडेट किया गया दस्तावेज़ मूल दस्तावेज़ आकार में फिट बैठता है (अधिक लचीलेपन के लिए पैडिंग के साथ खेलें)।