sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $query-operator ignorerer indeks?

Det var sjovt, jeg kan ikke beslutte mig for at sige, at det er en fejl eller ej, det er op til dig:

Der er to tilgængelige syntakser:http://docs.mongodb.org/manual/ reference/operatør/forespørgsel/

Når du bruger:

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

vil også

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

fungerer fint.

Når du bruger din løsning (den anden syntaks):

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

outputtet af

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

Vil vise som forespørgslen, der ikke bruger indekset

hvis du også bruger .hint til indekset, udelades resultatet. :) (Det er jeg ikke rigtig forstår)

Heldigvis er der også en anden syntaks for disse operationer:du kan bruge:

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

det vil have det rigtige output og viste mig brugen af ​​indekset. Der er også lignende syntaks for $hint.

Du kan tjekke dokumentationen her:http://docs.mongodb.org /manual/reference/meta-query-operators/

Jeg fandt dette virkelig interessant, så jeg tændte for profiler:

Jeg lavede en testsamling (queryTst) med omkring 250.000 dokumenter hver med kun _id og et aldersfelt i strukturen med et indeks på alder.

For denne forespørgsel:

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

jeg fik:

{
    "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" : ""
}

til dette:

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

jeg fik:

"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" : {

    },

i profileringsloggen:for den første

{
    "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" : ""
}

for det andet:

{
    "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" : ""
}

hvilket på en eller anden måde betyder for mig, at det er explain() der forårsager tabellen scanning i den blandede syntaks.



  1. hvordan man konfigurerer forskellige ttl for hver redis cache, når man bruger @cacheable i springboot2.0

  2. Ny C++ Mongo-driver:hvordan man ser type og hvordan man får strengværdi

  3. Hadoop-tællere og typer af tællere i MapReduce

  4. MongoDB diakritisk følsom søgning viser ikke alle accentuerede (ord med diakritisk tegn) rækker som forventet og omvendt