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

Does the size of a document affect performance of a find() query?

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

我运行在MongoDBshell

中对集合进行以下查询
r.find({_id:ObjectId("5552966b380c2dbc29472755")})

整个文档有 3MB。当我 运行 此查询时,操作大约需要 8 秒才能执行。该文档有一个 "salaries" 属性,它占文档大小的大部分(大约 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 两种情况下,您都可以建立索引以保持这些查询的速度。