我创建了一个测试MongoDB集合"sampleCollection",其文档如下所示:
"_id" : ObjectId("510929e041cb2179b41ace1c"),
"stringField" : "Random string0",
"longField" : NumberLong(886)
Run Code Online (Sandbox Code Playgroud)
并在字段"stringField"上有索引.当我执行
db.sampleCollection.find({"stringField":"Random string0"}).explain()
Run Code Online (Sandbox Code Playgroud)
一切都好:
"cursor" : "BtreeCursor stringField_1",
"isMultiKey" : false,
"n" : 2,
"nscannedObjects" : 2,
"nscanned" : 2,
"nscannedObjectsAllPlans" : 2,
"nscannedAllPlans" : 2,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"stringField" : [
[
"Random string0",
"Random string0"
]
]
}
Run Code Online (Sandbox Code Playgroud)
但
db.sampleCollection.find({$query:{"stringField":"Random string0"}}).explain()
Run Code Online (Sandbox Code Playgroud)
抓住我
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 4,
"nscanned" : 4,
"nscannedObjectsAllPlans" : 4,
"nscannedAllPlans" : 4,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
}
Run Code Online (Sandbox Code Playgroud)
这看起来不是问题,但我在生产和使用查询结构时使用org.springframework.data.mongodb框架是编写存储库的唯一方法.因此我有一个完全忽略索引数据的数据库.
这是对的吗?或者我误解了什么?
这很有趣我不能决定说它是一个错误或不是由你决定:
有两种可用的语法:http://docs.mongodb.org/manual/reference/operator/query/
当你使用:
db.collection.find( { age : 25 } )
Run Code Online (Sandbox Code Playgroud)
也会
db.collection.find( { age : 25 } ).explain()
db.collection.find( { age : 25 } ).hint(someindex)
Run Code Online (Sandbox Code Playgroud)
工作得很好.
当您使用解决方案时(其他语法):
db.collection.find( { $query: { age : 25 } } )
Run Code Online (Sandbox Code Playgroud)
的输出
db.sampleCollection.find({$query:{"stringField":"Random string0"}}).explain()
Run Code Online (Sandbox Code Playgroud)
将显示像查询不使用索引
如果您还使用.hint作为索引,它将省略结果.:)(那是我真的不明白)
幸运的是,这些操作还有另一种语法:您可以使用:
db.sampleCollection.find({$query:{"stringField":"Random string0"}, $explain:1})
Run Code Online (Sandbox Code Playgroud)
它将具有正确的输出并向我显示索引的用法.$ hint也有类似的语法.
您可以在此处查看文档:http://docs.mongodb.org/manual/reference/meta-query-operators/
我发现这很有趣所以我打开了探查器:
我制作了一个测试集合(queryTst),其中包含大约250k个文档,每个文档只有_id和结构中的年龄字段,并带有年龄索引.
对于此查询:
db.queryTst.find({$query:{"age":16},$explain:1})
Run Code Online (Sandbox Code Playgroud)
我有:
{
"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" : ""
}
Run Code Online (Sandbox Code Playgroud)
为了这:
db.queryTst.find({$query:{"age":16},$explain:1}).explain()
Run Code Online (Sandbox Code Playgroud)
我有:
"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" : {
},
Run Code Online (Sandbox Code Playgroud)
在探查器日志中:第一个
{
"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" : ""
}
Run Code Online (Sandbox Code Playgroud)
对于第二个:
{
"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" : ""
}
Run Code Online (Sandbox Code Playgroud)
以某种方式对我说的是explain()导致混合语法中的表扫描.
| 归档时间: |
|
| 查看次数: |
1736 次 |
| 最近记录: |