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 提高性能的主要内容,如果未能解决你的问题,请参考以下文章
提高MSSQL数据库性能对比count(*) 和 替代count(*)