MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Operator $query MongoDB mengabaikan indeks?

Itu lucu saya tidak bisa memutuskan untuk mengatakan itu adalah bug atau tidak terserah Anda:

Ada dua sintaks yang tersedia:http://docs.mongodb.org/manual/ referensi/operator/kueri/

Saat Anda menggunakan:

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

juga akan

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

bekerja dengan baik.

Saat Anda menggunakan solusi Anda (sintaks lainnya):

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

keluaran

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

Akan ditampilkan seperti kueri yang tidak menggunakan indeks

jika Anda juga menggunakan .hint untuk indeks itu akan menghilangkan hasilnya. :) (Itu saya tidak begitu mengerti)

Untungnya ada sintaks lain untuk operasi ini juga:Anda dapat menggunakan:

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

itu akan memiliki output yang tepat dan menunjukkan kepada saya penggunaan file index. Juga ada sintaks serupa untuk $hint.

Anda dapat memeriksa dokumentasi di sini:http://docs.mongodb.org /manual/reference/meta-query-operators/

Saya menemukan ini sangat menarik jadi saya mengaktifkan profiler:

saya membuat kumpulan tes (queryTst) dengan sekitar 250 ribu dokumen masing-masing hanya dengan _id dan bidang usia dalam struktur dengan indeks usia.

Untuk kueri ini:

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

saya mendapatkan:

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

untuk ini:

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

saya mendapatkan:

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

    },

di log profiler:untuk yang pertama

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

untuk yang kedua:

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

yang entah bagaimana berarti bagi saya itu adalah explain() menyebabkan tabel memindai dalam sintaks campuran.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mengetahui apakah Mongodb berjalan dalam mode auth dalam skrip Shell?

  2. Data null setelah menyimpan entitas dengan Moongose ​​dan GraphQL

  3. Bagaimana cara menambahkan kenaikan otomatis ke koleksi yang ada di mongodb/node.js?

  4. Bagaimana cara menerapkan tag posting di Mongo?

  5. Menginstal dan menggunakan MongoDB di Grails 3.x