同样的查询条件,同样的hint索引,为什么find很快,但count很慢。还有count怎么用explain。请高手优化下,问题解决即可领20元,微信转账,奖励不多意思一下。初创项目,后期也会有其他mongodb、nodejs等问题,需要高手,交个朋友。
find => db.getCollection('Foo').find({}).explain()
count => db.getCollection('Foo').explain().count()
不带条件的 count,mongo 的优化器会直接从一个每次有记录数变更就增减的值中获取数量。带条件的 count,会遍历符合要求的文档,当然慢了。find 快是因为获取到 limit 限制数量的文档后就停止继续扫描了。
那每次查询计数,条件都不同的话,怎么样计数最优呢
而且我用的是estimatedDocumentCount()
----mongoose官网推荐的方法。
我自己的程序如下:
但用了之后都是返回无条件的计数值,似乎之前的find的条件没用。
db.collection.estimatedDocumentCount() does not take a query filter and instead uses metadata to return the count for a collection.
是的,谢谢回答,这个我也看过了,那对于需要**条件计数(filter count)**的场景,mongodb就没法用么。我用aggregate也试了,也很慢。真的没辙了。
estimatedDocumentCount 方法是直接使用 mongo 维护的一个计数的,不适用 filter 条件 count 优化要根据实际情况而言,比如设置查询条件尽量少扫描数据,比如设置缓存之类。 数据库基本原理都是共通的,建议你找些书籍去看,比如《高性能 Mysql》就有相关章节。
谢谢回复,难怪好多应用里都是用 999+ 来充当具体的值。 看来具体的 条件计数 在性能上很难优化。
这个需求在关系型数据库中实现性能应该好许多。
可以考虑用redis外置这个计数,实时计算,延时同步.
加上索引呢