【问题标题】:Does the size of a document affect performance of a find() query?文档的大小会影响 find() 查询的性能吗?
【发布时间】:2015-05-13 22:24:36
【问题描述】:

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

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

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

整个文档为 3MB。当我运行此查询时,该操作大约需要 8 秒才能执行。该文档有一个“salaries”属性,它构成了文档大小的大部分(大约 2.9MB)。因此,当我省略薪水属性并运行以下查询时,它只需要不到一秒钟的时间。

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

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

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

【问题讨论】:

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


    【解决方案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 情况下,您可以构建索引以保持这些查询的快速。

    【讨论】:

    • 为了扩展您的建议“B”,基于 _id 的查询与子属性的查询有什么区别?性能方面不是一样吗?
    • 只要您设置了适当的索引,这两种方法可能具有相似的性能。在决定采用哪种方法时,您应该考虑其他因素。例如,您的巨型文档有一天会变得更大并威胁到超过 mongoDB 中 16MB 的文档大小限制吗?
    猜你喜欢
    • 2014-07-13
    • 2021-11-11
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多