【问题标题】:How specific should I be in MongoDB update commands, for performance?为了性能,我应该在 MongoDB 更新命令中具体到什么程度?
【发布时间】:2020-04-26 05:20:18
【问题描述】:

我很好奇在使用 mongoose 执行 updateMany 命令时应该在 where 查询中指定什么。

例如给定这个更新操作:{ $pull: { tags: { $in: ["tagone", "tagtwo"] } } }

where 查询应该是:

{organisation: "fffffff..."}{organisation: "fffffff...", tags: {$in: ["tagone", "tagtwo"]}

where 查询中的额外特异性会提高还是降低性能,还是没有区别?

(没有应用数据库索引)

【问题讨论】:

    标签: mongodb mongoose query-performance


    【解决方案1】:

    我会放一些我知道的东西,如果有任何改进,请更新:

    1) 好的,如果您没有指定过滤器并且没有索引,那么可以这样想 - 然后查询将遍历集合中的所有文档,查看 tags 数组以获取输入数组中传递的值并拉取如果这些值存在于tags 中。每个文档tags 数组都必须搜索值。

    2) 如果你有一个过滤器 - 即使那样,由于你没有启用任何索引,查询必须扫描集合中的所有文档,这是一个 collection scan,然后它会遍历过滤器文档(来自提供的过滤器的匹配文档)并更新 tags 数组。

    为什么我们需要集合中的索引和查询中的过滤器?

    首先,您为什么要在没有应用索引的情况下这样做?每个集合都必须正确索引。

    迭代内存中的索引键(索引字段的值)并从磁盘获取实际文档,更新这些文档并将其写回使用索引会很快,另一方面,过滤器将使查询通过更少的文档或索引运行键(如果已编入索引)来处理任何更新或在进一步阶段对文档的任何转换进行聚合的情况下。

    【讨论】:

    • 简而言之,更新过滤器越具体,服务器要做的工作就越少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多