_id字段与索引日期字段以获取最新文档

时间:2015-08-21 02:50:30

标签: performance mongodb

我需要能够找到最近添加的文档。我已决定包含一个日期字段,其中包含添加日期,此字段已编制索引。但是,我对哪个查询优越,性能明智有点好奇。说我想获得前50个文件,哪个查询运行得最快?

db.collection.find({}).sort({_id : 1}).limit(50);

db.collection.find({date : {$lt : new Date() }}).sort({_id : 1}).limit(50);

db.collection.find({}).sort({date : 1}).limit(50);

1 个答案:

答案 0 :(得分:1)

您可以使用 explain 来比较三个查询的效果。

鉴于三个查询并基于您提供的描述,第二个实际上在排序之前处理日期字段查询,第一个和第三个将按顺序直接扫描索引(_id字段索引,日期字段索引)。 哪一个在第一个和第三个之间最快,你可以自己找到解释。

此外,如果您需要查找最近添加的文档,则排序中的顺序应该类似于 _id: -1 ,即按降序排列。

真实案例是:

db.collection.find().sort({"_id": -1}).limit(50).explain()
{
    // BtreeCursor is an indicator that your query actually use the index
    "cursor" : "BtreeCursor _id_ reverse",
    "isMultiKey" : false,
    "n" : 50,
    "nscannedObjects" : 50,
    "nscanned" : 50,
    "nscannedObjectsAllPlans" : 50,
    "nscannedAllPlans" : 50,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    // time used to execute the query
    "millis" : 5,
    "indexBounds" : {
        "_id" : [
            [
                {
                    "$maxElement" : 1
                },
                {
                    "$minElement" : 1
                }
            ]
        ]
    },
    "server" : "....",
    "filterSet" : false
}