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

时间:2015-05-13 22:24:36

标签: node.js mongodb database-performance database nosql

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

我在MongoDB shell中的集合上运行以下查询

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

整个文件是3MB。当我运行此查询时,该操作大约需要8秒钟才能执行。该文档具有“工资”属性,占文档大小的大部分(约2.9MB)。因此,当我省略工资属性并运行以下查询时,它只需不到一秒钟。

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

我只在运行find()查询时才注意到这种性能差异。当我运行find()。count()查询时,没有任何区别。只有当我想要获取整个文档时,性能似乎才会降低。

集合永远不会更新(永远不会改变大小),在_id上设置索引,我在数据库上运行repairDatabase()。我在网上搜索过,但找不到令人满意的答案,为什么会有性能差异。任何见解和建议将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

我认为您刚刚进行的实验是对您自己问题的回答。

默认情况下,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两种情况下,您都可以构建索引以保持这些查询的快速。