मुद्दा यह है कि आपकी कोई भी अनुक्रमणिका वास्तव में सॉर्ट की गई क्वेरी में सहायता नहीं करती है। स्कैन की गई वस्तुओं की अधिक संख्या और SORT_KEY_GENERATOR
की उपस्थिति का यही कारण है स्टेज (इन-मेमोरी सॉर्ट, 32MB तक सीमित)।
दूसरी ओर, गैर-क्रमबद्ध क्वेरी या तो { category: 1, _id: 1 }
का उपयोग कर सकती है या { category: 1, _id: 1, sticky: 1, lastPostAt: 1 }
सूचकांक ध्यान दें कि किसी एक का उपयोग करना पूरी तरह से मान्य है, क्योंकि किसी एक में उपसर्ग . होता है दूसरे का। अधिक विवरण के लिए उपसर्ग देखें।
MongoDB find()
क्वेरीज़ आमतौर पर केवल एक इंडेक्स का उपयोग करती हैं, इसलिए एक एकल कंपाउंड इंडेक्स को आपकी क्वेरी के सभी मापदंडों को पूरा करना चाहिए। इसमें find()
. के दोनों पैरामीटर शामिल होंगे और sort()
।
मोंगोडीबी कंपाउंड इंडेक्स को ऑप्टिमाइज़ करने में आपकी अनुक्रमणिका कैसे बनाई जानी चाहिए इसका एक अच्छा लेखन उपलब्ध है। आइए लेख के मुख्य बिंदु को लेते हैं, जहां यौगिक अनुक्रमणिका क्रम समानता --> सॉर्ट --> श्रेणी होना चाहिए :
आपकी क्वेरी "आकृति" है:
db.collection.find({category:..., _id: {$gt:...}})
.sort({sticky:-1, lastPostAt:-1, _id:1})
.limit(25)
हम देखते हैं कि:
category:...
समानता . हैsticky:-1, lastPostAt:-1, _id:1
क्रमबद्ध है_id: {$gt:...}
श्रेणी . है
तो आपको जो कंपाउंड इंडेक्स चाहिए वह है:
{category:1, sticky:-1, lastPostAt:-1, _id:1}
जहां explain()
. की विजेता योजना है उपरोक्त इंडेक्स के साथ आपकी क्वेरी का आउटपुट दिखाता है:
"winningPlan": {
"stage": "LIMIT",
"limitAmount": 25,
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"category": 1,
"sticky": -1,
"lastPostAt": -1,
"_id": 1
},
"indexName": "category_1_sticky_-1_lastPostAt_-1__id_1",
"isMultiKey": false,
"multiKeyPaths": {
"category": [ ],
"sticky": [ ],
"lastPostAt": [ ],
"_id": [ ]
},
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 2,
"direction": "forward",
"indexBounds": {
"category": [
"[ObjectId('5a779b31f4fa724121265142'), ObjectId('5a779b31f4fa724121265142')]"
],
"sticky": [
"[MaxKey, MinKey]"
],
"lastPostAt": [
"[MaxKey, MinKey]"
],
"_id": [
"(ObjectId('5a779b5cf4fa724121269be8'), ObjectId('ffffffffffffffffffffffff')]"
]
}
}
}
}
ध्यान दें कि विजेता योजना में SORT_KEY_GENERATOR
. शामिल नहीं है मंच। इसका मतलब है कि क्रमबद्ध क्वेरी का जवाब देने के लिए अनुक्रमणिका का पूरी तरह से उपयोग किया जा सकता है।