MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Toán tử truy vấn MongoDB $ bỏ qua chỉ mục?

Điều đó thật buồn cười, tôi không thể quyết định nói rằng đó là lỗi hay không, điều đó phụ thuộc vào bạn:

Có hai cú pháp khả dụng: http://docs.mongodb.org/manual/ tham chiếu / toán tử / truy vấn /

Khi bạn sử dụng:

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

cũng sẽ

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

làm việc tốt.

Khi bạn sử dụng giải pháp của mình (cú pháp khác):

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

đầu ra của

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

Sẽ hiển thị giống như truy vấn không sử dụng chỉ mục

nếu bạn cũng sử dụng .hint cho chỉ mục, nó sẽ bỏ qua kết quả. :) (Đó là tôi không thực sự hiểu)

May mắn thay, có một cú pháp khác cho các thao tác này:bạn có thể sử dụng:

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

nó sẽ có đầu ra phù hợp và hiển thị cho tôi cách sử dụng chỉ mục. Cũng có cú pháp tương tự cho $ gợi ý.

Bạn có thể kiểm tra tài liệu tại đây: http://docs.mongodb.org / manual / reference / meta-query-operator /

Tôi thấy điều này thực sự thú vị nên tôi đã bật hồ sơ:

tôi đã thực hiện một bộ sưu tập thử nghiệm (queryTst) với khoảng 250 nghìn tài liệu, mỗi tài liệu chỉ có _id và một trường tuổi trong cấu trúc có chỉ mục về độ tuổi.

Đối với truy vấn này:

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

tôi đã nhận:

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

cho điều này:

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

tôi đã nhận:

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

    },

trong nhật ký trình biên dịch:cho lần đầu tiên

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

cho thứ hai:

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

điều này có nghĩa là theo tôi đó là giải thích () gây ra việc quét bảng theo cú pháp hỗn hợp.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kiểm tra đơn vị với Mongoose

  2. Model.findOne không trả về tài liệu nhưng trả về đối tượng trình bao bọc

  3. Tìm bản ghi mongoDB theo lô (sử dụng bộ điều hợp ruby ​​mongoid)

  4. Phép chiếu trong Truy vấn mệnh đề Where của tài liệu được nhúng trong Bộ sưu tập MongoDB sử dụng C #

  5. Làm cách nào để điền các tài liệu con được trả về sau khi tra cứu tổng hợp trong mongodb?