【问题标题】:mongodb.countDocuments is slow when result set is large even if index is used当结果集很大时,即使使用索引,mongodb.countDocuments 也很慢
【发布时间】:2019-09-05 08:50:36
【问题描述】:

当结果集很大时mongodb.countDocuments很慢

用户收集测试数据:

  • 10M 文档,状态为'active'
  • 100k 文档,状态为 'inactive'

字段status 已编入索引{状态:1}

db.users.countDocuments({status: 'active'}) 需要 2.91 秒 db.users.countDocuments({status: 'inactive'}) 需要 0.018 秒

我了解countDocuments 使用聚合来查找和计算结果。

estimatedDocumentCount() 在这种情况下不起作用,因为需要查询过滤器

有什么改进建议吗?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    计数似乎是应该便宜的东西之一,但通常并非如此。因为 mongo 不维护其 b-tree 索引中匹配特定条件的文档数量的计数,所以它需要在执行过程中扫描索引计数文档。这意味着计算 100 倍的文档将花费 100 倍的时间,这大致就是我们在这里看到的 -- 0.018 * 100 = 1.8s

    为了加快速度,您有几个选择:

    1. 活动计数大致为estimatedDocumentCount() - db.users.countDocuments({status: 'inactive'})。这对于您的用例是否足够准确?
    2. 或者,您可以在一个单独的集合中维护一个 counts 文档,以便与您拥有的活动/非活动文档的数量保持同步。

    【讨论】:

    • 感谢 willis 选项 1 是一个不错的选项,但如果我不知道哪个状态的文件较低,则会出现问题选项 2 是我现在所做的,只需要确认没有更好的方法为此,我将按照 mongodb count 最佳实践保留它
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2020-06-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多