我有一个包含 500 万条记录的测试集合: for(var i = 0; i < 5000000; i++) { db.testcol.insert({field1: i}) }
插入索引:db.testcol.ensureIndex({field1:1})
现在有趣的是:
mongos> db.testcol2.find({field1: {$gte: 0}},{field1:1,_id:0}).explain();
{
"cursor" : "BtreeCursor field1_1",
"isMultiKey" : false,
"n" : 5000000,
"nscannedObjects" : 0,
"nscanned" : 5000000,
"nscannedObjectsAllPlans" : 0,
"nscannedAllPlans" : 5000000,
"scanAndOrder" : false,
"indexOnly" : true,
"nYields" : 4,
"nChunkSkips" : 0,
"millis" : 4675,
"indexBounds" : {
"field1" : [
[
0,
1.7976931348623157e+308
]
]
},
"server" : "jvangaalen-PC:27020",
"millis" : 4675
}
Indexonly 为真,nscannedobject: 0(意味着它从未查看过真实文档来检查它
现在是相同的查询,但使用 _id:1(_id 不在索引中,因此它也必须查看文档):
> db.testcol2.find({field1: {$gte: 0}},{field1:1,_id:1}).explain(); {
> "cursor" : "BtreeCursor field1_1",
> "isMultiKey" : false,
> "n" : 5000000,
> "nscannedObjects" : 5000000,
> "nscanned" : 5000000,
> "nscannedObjectsAllPlans" : 5000000,
> "nscannedAllPlans" : 5000000,
> "scanAndOrder" : false,
> "indexOnly" : false,
> "nYields" : 5,
> "nChunkSkips" : 0,
> "millis" : 3742,
> "indexBounds" : {
> "field1" : [
> [
> 0,
> 1.7976931348623157e+308
> ]
> ]
> },
> "server" : "jvangaalen-PC:27020",
> "millis" : 3742 }
响应时间从 4.7 秒下降到 3.7 秒。Indexonly: false 和 nscannedobjects 为 5000000(全部)。这看起来很有趣,因为它似乎必须为相同的结果集做更多的工作,但仍然明显更快。
这怎么可能?我尝试不同的原因是,当它在分片后运行 indexonly:true 查询时,我无法将 nscannedobjects 设置为 0