当结果集很大时,即使使用索引,mongodb.countDocuments 也会很慢

Cha*_*aya 7 mongodb

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

用户收集测试数据:

  • 1000 万个带有状态的文档'active'
  • 100k 个带有状态的文档'inactive'

该字段status已索引 {status: 1}

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

据我所知,countDocuments使用聚合来查找和计算结果。

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

有什么改进建议吗?

wil*_*lis 14

计数似乎是一件应该很便宜的事情,但事实往往并非如此。由于 mongo 不会在其 B 树索引中维护符合特定条件的文档数量计数,因此它需要扫描索引计数文档。这意味着计算 100 倍的文档将花费 100 倍的时间,这大致就是我们在这里看到的 -- 0.018 * 100 = 1.8s

为了加快速度,您有以下几种选择:

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