अनुक्रमणिका को क्वेरी के सभी भाग (समानता भाग, सॉर्ट भाग, और श्रेणी भाग) को कवर करने की आवश्यकता होगी। ऐसा इसलिए है क्योंकि एक सामान्य find()
. में क्वेरी, MongoDB केवल एक अनुक्रमणिका का उपयोग करता है। उदा., यह आम तौर पर समानता भाग के लिए एक अनुक्रमणिका का उपयोग नहीं करता है, और सॉर्ट भाग के लिए अन्य अनुक्रमणिका का उपयोग नहीं करता है।
सामान्य तौर पर, अनुक्रमणिका में फ़ील्ड के अनुक्रम को समानता -> सॉर्ट -> श्रेणी के पैटर्न का पालन करने की आवश्यकता होती है ।
इसका विस्तार से वर्णन MongoDB कंपाउंड इंडेक्स को ऑप्टिमाइज़ करना में किया गया है। ।
आपकी क्वेरी के लिए, समानता वाला हिस्सा है tag:..., letterId:...
और क्रमबद्ध भाग emailId:-1
. है . आपकी क्वेरी में कोई श्रेणी भाग नहीं है।
इस पैटर्न का उपयोग करते हुए, आपको जो यौगिक सूचकांक चाहिए वह है:
db.test.createIndex({tag:1, letterId:1, emailId:-1})
आइए यह पुष्टि करने का प्रयास करें कि इस अनुक्रमणिका का उपयोग करके हम कितना प्रदर्शन सुधार प्राप्त कर सकते हैं।
टेस्ट डेटा
अनुक्रमणिका की उपयुक्तता की पुष्टि करने के लिए, मैंने mgeneratejs का उपयोग करके परीक्षण डेटाबेस में 1 मिलियन रिकॉर्ड सम्मिलित किए। , जो एक टेम्पलेट का उपयोग करके एक यादृच्छिक दस्तावेज़ बनाने का एक उपकरण है।
आपके उदाहरण के आधार पर, mgeneratejs
मैं जिस टेम्पलेट का उपयोग कर रहा हूं वह है:
$ cat template.json
{
"emailId": "$hash",
"email": "$email",
"letterId": "$hash",
"sendedFrom": "$email",
"resultMsg": "$word",
"owner": "$name",
"created": "$date",
"result": "$bool",
"tag": "$word",
"tryNum": {"$integer": {"min": 0, "max": 1e3}},
"clickHash": "$word",
"links": {"$array": {"of": "$url", "number": {"$integer": {"min": 1, "max": 5}}}}
}
और MongoDB में 1 मिलियन यादृच्छिक दस्तावेज़ आयात किए:
$ mgeneratejs template.json -n 1000000 | mongoimport -d test -c test
परीक्षा 1:गैर-इष्टतम अनुक्रमणिका
फिर मैं आपके पास अनुक्रमणिका बनाता हूं, और एक गैर-मौजूद दस्तावेज़ खोजने की कोशिश करता हूं और केवल इस अनुक्रमणिका वाले संग्रह के साथ क्वेरी के 10 रन एकत्र करता हूं:
> db.test.createIndex({emailId: 1, letterId: 1, result: 1, owner: 1, tag: 1, clickHash: 1})
> db.test.find({"tag" : "xyz", "letterId" : "abc"}).sort({emailId: -1}).limit(1)
Fetched 0 record(s) in 3069ms
Fetched 0 record(s) in 2924ms
Fetched 0 record(s) in 2923ms
Fetched 0 record(s) in 3013ms
Fetched 0 record(s) in 2917ms
Fetched 0 record(s) in 2961ms
Fetched 0 record(s) in 2882ms
Fetched 0 record(s) in 2870ms
Fetched 0 record(s) in 2969ms
Fetched 0 record(s) in 2863ms
इसलिए उस अनुक्रमणिका का उपयोग करते हुए, क्वेरी का प्रतिक्रिया समय बहुत अच्छा नहीं होता है, अधिकांश निष्पादन 3 सेकंड के करीब होता है।
टेस्ट 2:समानता -> सॉर्ट -> श्रेणी अनुक्रमणिका
इष्टतम समानता -> सॉर्ट -> श्रेणी . जोड़कर सूचकांक:
> db.test.createIndex({tag:1, letterId:1, emailId:-1})
> db.test.find({"tag" : "xyz", "letterId" : "abc"}).sort({emailId: -1}).limit(1)
Fetched 0 record(s) in 2ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 3ms
इसके विपरीत, इष्टतम सूचकांक का उपयोग करते हुए, प्रदर्शन में उल्लेखनीय सुधार हुआ। 3ms से अधिक में कोई प्रश्न नहीं लौटा, अधिकांश समय यह 1ms में वापस आ जाता है।