我需要能够找到最近添加的文档。我已决定包含一个日期字段,其中包含添加日期,此字段已编制索引。但是,我对哪个查询优越,性能明智有点好奇。说我想获得前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);
答案 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
}