【问题标题】:Why MongoDB find has same performance as count为什么 MongoDB find 与 count 具有相同的性能
【发布时间】:2018-10-23 13:45:12
【问题描述】:

我正在对我的 MongoDB 运行测试,出于某种原因,find 的性能与 count 相同。

统计: 订单集合大小:~20M, product_id 为 6 的订单:~5K

product_id 已编入索引以提高性能。

查询:db.orders.find({product_id: 6})db.orders.find({product_id: 6}).count()

0.08ms 后产品订单对比 5K

为什么计数没有显着加快?它可以通过 product_id 索引找到第一个和最后一个元素的位置

【问题讨论】:

  • 它怎么能比0.08ms 快得多?除非你从find 消耗整个光标,否则find 只会加载结果的第一页,而不是全部5K。

标签: mongodb database-performance


【解决方案1】:

正如Mongo documentation for count 所说,调用count 与调用find 相同,但它不会返回文档,而是只计算它们。为了执行这个计数,它遍历游标。它不能只读取索引并根据某个 ID 的第一个和最后一个值确定文档的数量,特别是因为您可以在其他一些不是 ID 的字段上拥有索引(并且 Mongo ID 不是自动递增的)。所以基本上findcount 是相同的操作,但不是获取文档,而是遍历它们并将它们的数量相加并返回给您。

另外,如果您想要更快的结果,您可以使用estimatedDocumentsCount (docs),它会直接进入集合的元数据。这导致无法询问“如果我触发此查询,我可以期待多少文档?”。如果您需要以更快的方式查找查询的文档数,那么您可以使用 countDocuments (docs),它是聚合查询的包装器。根据我对 Mongo 的了解,提供的查询看起来是一种无需调用 count 即可计算查询结果的最快方法。我想这应该是从现在开始计算文档性能的首选方式(因为它是在版本 4.0.3 中引入的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多