MongoDB的count()非常慢。 我们如何改进/解决它?

我目前正在使用MongoDB和数百万条数据logging。 我发现了一件非常烦人的事情。

当我用less量的查询数据收集使用“count()”函数时,速度非常快。 但是,当查询的数据集合包含数千甚至数百万条数据logging时,整个系统变得非常缓慢。

我确信我已经索引了必填字段。

有没有人遇到同样的事情? 你怎么做才能改善呢?

现在有另一个优化比创build适当的索引。

db.users.ensureIndex({name:1}); db.users.find({name:"Andrei"}).count(); 

如果你需要一些柜台,我build议在可能的时候进行预先计算。 通过使用primefaces$ inc操作,而不是使用count({})

但是,在mongodb上努力工作的mongodb工作人员,根据jira bug count({})他们在mongodb 2.1中计划的改进。

您可以确保索引真正在没有任何磁盘访问的情况下使用。

假设你想要logging名字:“Andrei”

你确保名字上的索引(和你一样)和

 db.users.find({name:"andrei"}, {_id:0, name:1}).count() 

你可以通过检查是否是最快的方法来检查(除了预计算)

 db.users.find({name:"andrei"}, {_id:0, name:1}).explain() 

显示一个设置为true的index_only字段。

这个技巧将确保您的查询将只从RAM(索引)而不是从磁盘检索logging。

现在你几乎不走运了,在不久的将来,MongoDB算是糟透了,不会变好。 请参阅: https : //jira.mongodb.org/browse/SERVER-1752

从经验来看,除非是一次性事物,否则几乎不会发生,或者您的数据库非常小。

正如@Andrew Orsich所说,尽可能使用计数器(对计数器的下降是全局写入locking,但优于count())。

对我来说,解决方法是改变索引稀疏 。 这取决于具体情况,只要尝试一下即可。

 db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } ) db.Account.find({ "dateChecked" : { $exists : true } }).count() 

收集中有318万条logging

  • 0.31秒 – 具有稀疏的索引
  • 0.79秒 – 具有非稀疏索引