我偶然发现了以下行为: 在一个只有两个字段(_id和d)的大约14000个文档的集合中,我做了一个繁重的查询,这不会花费很长时间,因为我的文档很少。
没有索引,但默认情况下为_id,查询为:
db.col.explain('executionStats').find({$or: [{_id: /^.*\bACCIDENT$/}, {d: /^.*\bACCIDENT.*$/}]}).limit(15)
抛出结果(相关部分):
"winningPlan" : {
"stage" : "SUBPLAN",
"inputStage" : {
"stage" : "LIMIT",
"limitAmount" : 0,
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"$or" : [
{
"_id" : /^.*\bACCIDENT$/
},
{
"d" : /^.*\bACCIDENT.*$/
}
]
},
"direction" : "forward"
}
}
},
"rejectedPlans" : [ ]
"nReturned" : 15,
"executionTimeMillis" : 26,
"totalKeysExamined" : 0,
"totalDocsExamined" : 9834,
然后我用
创建一个索引db.col.createIndex({_ id:1,d:1})
然后使用explain运行相同的查询(再次只是相关部分):
"winningPlan" : {
"stage" : "SUBPLAN",
"inputStage" : {
"stage" : "LIMIT",
"limitAmount" : 0,
"inputStage" : {
"stage" : "COLLSCAN",
"filter" : {
"$or" : [
{
"_id" : /^.*\bACCIDENT$/
},
{
"d" : /^.*\bACCIDENT.*$/
}
]
},
"direction" : "forward"
}
}
},
"rejectedPlans" : [ ]
"nReturned" : 15,
"executionTimeMillis" : 57,
"totalKeysExamined" : 0,
"totalDocsExamined" : 9834,
正如您所看到的,获胜计划再次成为COLLSCAN,但这次花了两倍的时间。
所以,我很好奇是什么让mongodb花费了额外的时间。
我正在使用mongod 3.0.5。 查询是从mongo shell执行的,并做了其他类似结果的示例,包括一遍又一遍的相同查询。