mongodb - count 提高性能

Posted

技术标签:

【中文标题】mongodb - count 提高性能【英文标题】:mongodb - count improve performance 【发布时间】:2016-05-25 20:39:04 【问题描述】:

我研究了mongodb的性能。我收集了 5 亿份文档。我创建了两个索引:

db.appels.createIndex(OPERATEUR_RECEVEUR:1);
db.appels.createIndex(DUREE_APPEL:1);

依靠一个领域,速度很快:

15 秒:

db.appels.find (   "DUREE_APPEL" :  "$gt" : 42  ).count();

2 秒:

 db.appels.find(OPERATEUR_RECEVEUR:"MTN").count();

但是用“and”来计算两个字段,速度很慢:

7 分钟:

db.appels.find (  $and : [   "DUREE_APPEL" :  "$gt" : 42  , OPERATEUR_RECEVEUR:"MTN" ]  ).count();

(这是同一时间没有字段索引)

最后,用“或”来指望两个字段是不可能的:

15 小时后终止查询:

db.appels.find (  $or : [   "DUREE_APPEL" :  "$gt" : 42  , OPERATEUR_RECEVEUR:"MTN" ]  ).count();

我不能使用多索引,因为我有 100 列。我使用 1 个节点和 debian 8、2 SSD、80 Go Ram、12 Cpu、mongodb 2.4。如何提高速度?

【问题讨论】:

为什么不能在两个字段上创建索引?在您的情况下,DUREE_APPEL 和 OPERATEUR_RECEVEUR。见docs.mongodb.com/manual/core/index-compound 感谢您的回复。我事先不知道查询是什么,或者将使用多少个字段(有时 1,有时 2,..,...,有时 10)。查询是根据最终用户在 Web 界面中的选择动态生成的。如果我有 100 列,我就有数千个索引要创建。 好吧,如果你不预先知道,我建议在每个字段上创建索引。我知道您的索引会使用额外的资源,但会通过快速返回数据来提升用户体验。 在每个字段上创建一个索引 = 100 个索引。通过两个 = 500(大约)索引在所有字段上创建复合索引。在所有三个字段上创建复合索引 = ... ... ... 。然后 4, 5, 6 ... 10 。这是你推荐的吗? 不。我建议在每个字段上都有一个更有可能被搜索到的字段。再次,使用您自己的最佳判断 【参考方案1】:

我发现是“计数”很慢,没有研究。 在相同的字段上,响应时间与结果数成正比

"DUREE_APPEL" : "$gt" : 42 --> 198 757 639 条记录 --> 32 秒

"DUREE_APPEL" : "$gt" : 800 --> 11 479 097 条记录 --> 1.9 秒

"DUREE_APPEL" : "$gt" : 5000 --> 833 961 条记录 --> 0.14 秒

索引不是唯一的解决方案,如何解决这个问题?

使用分片(5000 万行,10 个节点)可以作为解决方案吗? :https://docs.mongodb.com/manual/sharding/

皮埃尔

【讨论】:

以上是关于mongodb - count 提高性能的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 如何提高创建索引的性能?

提高 MySQL 中的 count() 性能

SQL 提高性能

提高MSSQL数据库性能对比count(*) 和 替代count(*)

如何提高 MongoDB 中 update() 和 save() 的性能?

Groupby、Split 和 Count 组合(删除循环以提高 pytorch 性能)