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

时间:2019-09-05 08:50:36

标签: mongodb

mongodb.countDocuments在结果集很大时会变慢

有关用户集合的测试数据:

  • 1000万个文档,状态为'active'
  • 状态为'inactive'的10万份文档

字段status的索引为{status:1}

db.users.countDocuments({status: 'active'})耗时2.91秒 db.users.countDocuments({status: 'inactive'})花费0.018秒

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

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

有什么改进建议吗?

1 个答案:

答案 0 :(得分:0)

计数似乎就像应该便宜的东西之一,但通常并非如此。由于mongo不会在其b树索引中维护符合特定条件的文档数量的计数,因此它需要在索引计数过程中一直扫描整个文档。这意味着计算100倍的文档将花费100倍的时间,而这大致就是我们在这里看到的-0.018 * 100 = 1.8s

要加快速度,您有几种选择:

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