mongoose中,find很快但count很慢,求优化。如果成功解决,请留下微信,悬赏20元,意思一下。
发布于 5 年前 作者 ailuhaosi 9657 次浏览 来自 问答

同样的查询条件,同样的hint索引,为什么find很快,但count很慢。还有count怎么用explain。请高手优化下,问题解决即可领20元,微信转账,奖励不多意思一下。初创项目,后期也会有其他mongodb、nodejs等问题,需要高手,交个朋友。

10 回复

find => db.getCollection('Foo').find({}).explain() count => db.getCollection('Foo').explain().count()

不带条件的 count,mongo 的优化器会直接从一个每次有记录数变更就增减的值中获取数量。带条件的 count,会遍历符合要求的文档,当然慢了。find 快是因为获取到 limit 限制数量的文档后就停止继续扫描了。

那每次查询计数,条件都不同的话,怎么样计数最优呢

而且我用的是estimatedDocumentCount()----mongoose官网推荐的方法。 捕获qq.PNG 我自己的程序如下: 捕获bb.PNG 但用了之后都是返回无条件的计数值,似乎之前的find的条件没用。

@ailuhaosi image.png

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外置这个计数,实时计算,延时同步.

加上索引呢

回到顶部