文档的大小是否会影响find()查询的性能?

问题描述:

MongoDB文档的大小是否会影响find()查询的性能?文档的大小是否会影响find()查询的性能?

我正在对集合下面的查询,在MongoDB的外壳

r.find({_id:ObjectId("5552966b380c2dbc29472755")}) 

整个文档为3MB。当我运行这个查询时,操作需要大约8秒钟的时间来执行。该文件具有构成文件大小(约2.9MB)的“工资”属性。因此,当我省略薪水属性并运行以下查询时,所用时间不到一秒钟。

r.find({_id:ObjectId("5552966b380c2dbc29472755")},{salaries:0}) 

当我仅运行find()查询时,我只注意到这种性能差异。当我运行find()。count()查询时,没有区别。看来,只有当我想要获取整个文档时,性能才会下降。

集合从不更新(从不更改大小),在_id上设置索引,并且我在数据库上运行了repairDatabase()。我在网上搜索过,但找不到令人满意的答案,为什么会出现性能差异。任何洞察力和建议,将不胜感激。谢谢。

我想你刚刚跑过的实验是对自己问题的回答。

默认情况下,Mongo将索引_id字段,因此文档大小不应影响定位文档所用的时间长度,但如果其大小为3MB,则您可能会注意到实际下载该数据的差异。我想这就是为什么如果你忽略了一些领域,它会花更少的时间。

要了解您的查询实际上正在跑了多久更好的感觉,试试这个:

r.find({ 
    _id: ObjectId("5552966b380c2dbc29472755") 
}) 
    .explain(function(err, explaination) { 
     if (err) throw err; 
     console.log(explaination); 
    }); 

如果salaries是3MB罪魁祸首,它的结构化数据,然后加快速度,你可以尝试A)将其分割成单独的mongo文档或B)基于该文档的子属性进行查询,并且在A和B两种情况下都可以构建索引以保持快速查询。

+0

要扩展您的建议“B”,基于_id查询与子属性之间的区别是什么?表现明智不会是同一回事吗? – SNV7

+0

只要你有适当的索引设置,这两种方法可能具有相似的性能。在决定采取何种方法时,应考虑其他因素。例如,你的大文件有一天会变大并威胁要通过mongoDB中的16MB文件大小限制吗? –