MongoDB:什么更快:单个find()查询或许多find_one()?

时间:2017-03-05 13:12:05

标签: mongodb performance

我将以下问题连接到MongoDB数据库设计。这是我的情况:

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

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

  • 执行单个查询,检索我感兴趣的所有文档,
  • 执行N个查询,每个人都获得单个文档,其中通常25< N< 100(100

所以问题是当我在一个查询上执行许多小查询时是否还有额外的开销?在关系数据库中进行许多查询是一种非常糟糕的做法 - 但在NoSQL中?我在问一般的做法 - 我应该避免那么多疑问吗?

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

感谢您的帮助;)

2 个答案:

答案 0 :(得分:1)

在一个查询上执行小型查询时出现的问题是网络开销,即网络延迟往返。

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

此外,您可能需要对数据进行预处理,例如手动汇总数据。

答案 1 :(得分:1)

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

IMO,对于您的用例,即25<N<100,一定应该进行批处理。

如果是单一查询:

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

正如上面的答案中所解释的那样,对于批量处理的数量与往返次数的比较,出现了一个甜蜜点,这也取决于您的文档类型。

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