MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB - श्रेणीबद्ध क्वेरी पर छँटाई और सीमित करते समय सूचकांक का उपयोग नहीं किया जा रहा है

मुद्दा यह है कि आपकी कोई भी अनुक्रमणिका वास्तव में सॉर्ट की गई क्वेरी में सहायता नहीं करती है। स्कैन की गई वस्तुओं की अधिक संख्या और 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 . शामिल नहीं है मंच। इसका मतलब है कि क्रमबद्ध क्वेरी का जवाब देने के लिए अनुक्रमणिका का पूरी तरह से उपयोग किया जा सकता है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB (नेवला) में आभासी क्षेत्र द्वारा छँटाई

  2. जावा का उपयोग करके मोंगोडब में ऑटो वृद्धि अनुक्रम

  3. जावा के लिए बीएसओएन पुस्तकालय?

  4. MongoDB के साथ MapReduce वास्तव में, वास्तव में धीमा (समान डेटाबेस के लिए MySQL में 30 घंटे बनाम 20 मिनट)

  5. SQL में किसी संख्या को प्रतिशत के रूप में प्रारूपित करें