javaee论坛

普通会员

225648

帖子

341

回复

355

积分

楼主
发表于 2017-08-26 07:09:27 | 查看: 604 | 回复: 0
mongodb提供三种方式来实现聚合:聚合管道,map-reduce,及单一目的的聚合方法。
管道操作可以在分片的集合上运算,可以使用索引来提高效率,管道使用了mongodb内部的操作来进行高效数据聚合,是聚合操作的首选。
这里写图片描述

matchsort操作出现在管道的开始位置时候可以使用索引。在3.2开始索引可以覆盖聚合管道。
如果你的聚合操作只需要部分数据,使用matchlimitskipmatch放到管道头部。管道在执行的时候,有个内部的优化,重新组织管道来提高性能。要查看是怎么转换的,需要在db.collection.aggregate()方法添加explain选项。聚合管道会判断是否能通过部分字段就能获取到结果,如果能,管道就会只使用这些字段,降低数据的处理数量。
组合的优化,sort+match这种方式,mongodb会将$match前置,降低排序的数量。还有很多优化顺序的情况,参考:

https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/
一些限制:管道的stage使用100mb的内存,如果超过这个限制,那mongodb会抛出一个错误,为了允许超过这个限制,需要使用allowDiskUse选项,来将超出限制的数据放置到临时文件上。
结果集的大小:返回结果集的大小如果超过了BSON Document Size的话会报错。

map-reduce使用定制的js函数来进行map和reduce操作,方式相比较管道来说,相对效率不高但是更复杂。
这里写图片描述

单一目的的聚合方法:这种方式是操作在单个的集合上,相比较前2个方法来说,他们缺乏灵活性,大数据量时候也不如前2中方式。
这里写图片描述


您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017