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

MongoDB $query ऑपरेटर अनुक्रमणिका पर ध्यान नहीं देता है?

यह मजाकिया था मैं यह कहने का फैसला नहीं कर सकता कि यह एक बग है या नहीं यह आप पर निर्भर है:

दो सिंटैक्स उपलब्ध हैं:http://docs.mongodb.org/manual/ संदर्भ/ऑपरेटर/क्वेरी/

जब आप उपयोग कर रहे हों:

db.collection.find( { age : 25 } )

भी होगा

db.collection.find( { age : 25 } ).explain()
db.collection.find( { age : 25 } ).hint(someindex)

ठीक काम करो।

जब आप अपने समाधान (अन्य सिंटैक्स) का उपयोग कर रहे हों:

db.collection.find( { $query: { age : 25 } } )

. का आउटपुट
db.sampleCollection.find({$query:{"stringField":"Random string0"}}).explain()

अनुक्रमणिका का उपयोग नहीं करने वाली क्वेरी की तरह दिखाई देगी

यदि आप सूचकांक के लिए .hint का भी उपयोग करते हैं तो यह परिणाम को छोड़ देगा। :) (यानी मैं वास्तव में समझ नहीं पा रहा हूं)

सौभाग्य से इन ऑपरेशनों के लिए एक और सिंटैक्स भी है:आप इसका उपयोग कर सकते हैं:

db.sampleCollection.find({$query:{"stringField":"Random string0"}, $explain:1})

इसका सही आउटपुट होगा और मेरे लिए इंडेक्स का उपयोग दिखाया जाएगा। साथ ही $hint के लिए समान सिंटैक्स है।

आप दस्तावेज़ यहाँ देख सकते हैं:http://docs.mongodb.org /मैनुअल/संदर्भ/मेटा-क्वेरी-ऑपरेटर/

मुझे यह वास्तव में दिलचस्प लगा इसलिए मैंने प्रोफाइलर चालू कर दिया:

मैंने लगभग 250k दस्तावेज़ों के साथ एक परीक्षण संग्रह (queryTst) बनाया है, जिनमें से प्रत्येक में केवल _id है और उम्र के आधार पर एक इंडेक्स के साथ संरचना में एक आयु फ़ील्ड है।

इस प्रश्न के लिए:

db.queryTst.find({$query:{"age":16},$explain:1})

मुझे मिल गया:

{
    "cursor" : "BtreeCursor age_1",
    "isMultiKey" : false,
    "n" : 2,
    "nscannedObjects" : 2,
    "nscanned" : 2,
    "nscannedObjectsAllPlans" : 2,
    "nscannedAllPlans" : 2,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "age" : [
            [
                16,
                16
            ]
        ]
    },
    "allPlans" : [
        {
            "cursor" : "BtreeCursor age_1",
            "n" : 2,
            "nscannedObjects" : 2,
            "nscanned" : 2,
            "indexBounds" : {
                "age" : [
                    [
                        16,
                        16
                    ]
                ]
            }
        }
    ],
    "oldPlan" : {
        "cursor" : "BtreeCursor age_1",
        "indexBounds" : {
            "age" : [
                [
                    16,
                    16
                ]
            ]
        }
    },
    "server" : ""
}

इसके लिए:

 db.queryTst.find({$query:{"age":16},$explain:1}).explain()

मुझे मिल गया:

"cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 250011,
    "nscanned" : 250011,
    "nscannedObjectsAllPlans" : 250011,
    "nscannedAllPlans" : 250011,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 103,
    "indexBounds" : {

    },

प्रोफाइलर लॉग में:पहले के लिए

{
    "ts" : ISODate("2013-01-30T20:35:40.526Z"),
    "op" : "query",
    "ns" : "test.queryTst",
    "query" : {
        "$query" : {
            "age" : 16
        },
        "$explain" : 1
    },
    "ntoreturn" : 0,
    "ntoskip" : 0,
    "nscanned" : 2,
    "keyUpdates" : 0,
    "numYield" : 0,
    "lockStats" : {
        "timeLockedMicros" : {
            "r" : NumberLong(368),
            "w" : NumberLong(0)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(8),
            "w" : NumberLong(5)
        }
    },
    "nreturned" : 1,
    "responseLength" : 567,
    "millis" : 0,
    "client" : "127.0.0.1",
    "user" : ""
}

दूसरे के लिए:

{
    "ts" : ISODate("2013-01-30T20:35:47.715Z"),
    "op" : "query",
    "ns" : "test.queryTst",
    "query" : {
        "query" : {
            "$query" : {
                "age" : 16
            },
            "$explain" : 1
        },
        "$explain" : true
    },
    "ntoreturn" : 0,
    "ntoskip" : 0,
    "nscanned" : 250011,
    "keyUpdates" : 0,
    "numYield" : 0,
    "lockStats" : {
        "timeLockedMicros" : {
            "r" : NumberLong(104092),
            "w" : NumberLong(0)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(13),
            "w" : NumberLong(5)
        }
    },
    "nreturned" : 1,
    "responseLength" : 373,
    "millis" : 104,
    "client" : "127.0.0.1",
    "user" : ""
}

जो किसी भी तरह मेरे लिए इसका मतलब है कि व्याख्या () मिश्रित वाक्यविन्यास में तालिका स्कैन का कारण बनती है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. बीएसओएन ::ऑब्जेक्ट आईडी बनाम मोंगो ::ऑब्जेक्ट आईडी

  2. मोंगो स्कीमा (एम्बेडिंग बनाम संदर्भ)

  3. क्या MongoDB _id . के साथ मिश्रित शार्ड कुंजी का उपयोग करते समय अद्वितीय _id फ़ील्ड मान सुनिश्चित करता है?

  4. IXSCAN करने के बाद FETCH में नल फिल्टर के लिए Mongo क्वेरी क्यों?

  5. नेवला:id . के आधार पर छँटाई