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秒 – 具有非稀疏索引