基于索引统计的MongoDB索引选择

基于索引统计的MongoDB索引选择,mongodb,indexing,Mongodb,Indexing,我们收集了近3亿份文件。我正在通过添加索引来提高查询性能。 考虑以下是DOC结构: { _id: ObjectId("abc1323", a:"val1", b: "val2", c: { "f1" : "v1", "f2" : "v2", "f3" : "v3" } d: "val3" } 正在执行的查询如下所示: db.collection.find({ _id:{'$gte':{ObjectId('5DE06D90000000000000000')},$lt

我们收集了近3亿份文件。我正在通过添加索引来提高查询性能。 考虑以下是DOC结构:

{ _id: ObjectId("abc1323",
a:"val1", 
b: "val2", 
c: { "f1" : "v1",
     "f2" : "v2",
     "f3" : "v3"
   }
d: "val3"
}
正在执行的查询如下所示:

db.collection.find({ _id:{'$gte':{ObjectId('5DE06D90000000000000000')},$lt':{ObjectId('5DE0DE1000000000000000000')}, c、 f3:“v3” })

我创建的索引是: Index1:
{“\u id”:1,“c.f3”:1}
Index2:
{“c.f3”:1,“\u id”:1}

使用index1,执行统计数据为(获胜计划)

使用Index2时,执行统计数据为:

"executionStats" : {
                "nReturned" : 59,
                "executionTimeMillis" : 305,
                "totalKeysExamined" : 59,
                "totalDocsExamined" : 59,
因此,对于Index1,查询以最快的时间返回结果,但是
TotalKeysChecked
比它返回的结果要多,使用Index2时,查询需要一些时间返回结果,但是
TotalKeysChecked
nReturned
完全相同,即扫描:返回的比率正好是1,以执行时间为代价。 所以我需要在这两个索引之间做出一些明确的选择。Index1速度更快,但吞吐量(扫描:返回比率)较差,而Index2具有出色的吞吐量。请给我一些建议


谢谢

我认为索引用于性能——速度。这就是应用程序用户想要的,快速响应时间。我只能建议使用更多具有不同数据范围的查询进行测试,并注意查询计划的输出。也就是说,如果索引只有
{“c.f3”:1}
键,那么查询将如何执行?您可能想试试看..您确定比较的方式正确吗?index2应该更快,因为索引存储为b树。它将使用c.f3:v3到达分支,然后执行一个范围。运行测试时,请确保此时只存在一个索引,并且没有其他操作在进行。@Yahya,理想情况下应该是这样,使用Index2应该会提供更好的性能,但事实并非如此。不确定为什么Index1在这种情况下更快。查询执行时间将根据索引和文档是否在内存中以及其他并发执行的操作等因素而变化。我肯定会选择更有效的索引。如果比较完整的解释输出,您可能会发现一些差异,这有助于澄清时间花在了什么地方——我怀疑查询#1从磁盘获取的数据会更少,或者产生的次数会更少。为了进行更公平的比较,您还应该在多个迭代中平均执行时间。
"executionStats" : {
                "nReturned" : 59,
                "executionTimeMillis" : 305,
                "totalKeysExamined" : 59,
                "totalDocsExamined" : 59,