2

我有一个包含 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

4

0 回答 0