【问题标题】:MongoDB: what is faster: single find() query or many find_one()?MongoDB:哪个更快:单个 find() 查询还是多个 find_one()?
【发布时间】:2017-03-05 21:35:26
【问题描述】:

我有以下与 MongoDB 数据库设计有关的问题。这是我的情况:

  • 我有一个包含大约 50k 文档(每个 15kB)的集合,
  • 每个文档都有一个存储数据样本的字典,
  • 我的查询总是从文档中获取所有数据,
  • 每个查询都使用索引,
  • 该集合只有一个索引(基于单个日期时间字段),
  • 在大多数情况下,我需要从许多文档中获取数据(通常为 25
  • 对我来说,对单个查询执行多个 SELECT 查询会更容易,
  • 我的数据库中有很多更新,比 SELECT 少得多,
  • 我使用 WiredTiger 引擎(最新版本的 MongoDB),
  • 服务器实例和 Web 应用程序在同一台机器上。

我有两种可能进行 SELECT 查询:

  • 执行单个查询以检索我感兴趣的所有文档,
  • 执行 N 次查询,每个人都会得到一个文档,其中通常 25

所以问题是,当我对单个查询执行多个小查询时,是否有任何额外开销?我问的是一般做法 - 我应该避免这么多查询吗?

在文档中,我读到查询的数量并不重要,但搜索文档的数量 - 这是真的吗?

感谢您的帮助;)

【问题讨论】:

    标签: mongodb performance


    【解决方案1】:

    有一个类似你问的问题:Is it ok to query mongodb multiple times

    IMO,对于您的用例,即25<N<100,绝对应该使用批处理。

    如果是单个查询:

    • 在单个线程中循环是不够的,您必须发出并行请求,这会产生额外的开销
    • 为每个请求创建 tcp/ip 开销
    • 对于创建和耗尽游标的每个查询都有一定数量的设置和拆卸,这会产生不必要的开销。

    正如上面的答案所解释的,对于要批处理的值与往返次数之间似乎存在一个最佳点,这也取决于您的文档类型。

    从广义上讲,10<N<1000 的任何内容都应与批处理一起使用,其余记录应构成其他批处理的一部分,但一次查询单个文档肯定会产生不必要的开销。

    【讨论】:

      【解决方案2】:

      当您对一个查询执行小查询时,问题是网络开销,即网络延迟往返。

      对于批处理中的单个请求,它可能并不多,但是如果您发出多个这样的请求或在前端使用此技术,则会降低性能。

      您可能还需要对数据进行预处理,例如手动排序聚合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2010-11-15
        • 2015-10-01
        • 2014-05-16
        • 2011-03-26
        • 2012-06-12
        相关资源
        最近更新 更多