Mongodb聚合框架比map / reduce更快吗?
mongodb 2.2中引入的聚合框架是否比map / reduce有任何特殊的性能改进?
如果是,为什么以及如何和多less?
(我已经为自己做了testing,性能几乎相同)
我亲自运行的每个testing(包括使用自己的数据)都显示聚合框架的速度比缩小速度快,通常速度要快一个数量级。
只是把你发布的数据的1/10(而不是清除操作系统caching,首先升温caching – 因为我想测量聚合的性能,而不是多久才需要在数据中)我得到这个:
MapReduce:1,058ms
聚合框架:133ms
从聚合框架中移除$ match,从mapReduce中移除{query:}(因为两者都只使用一个索引,而不是我们想要测量的),并通过key2对整个数据集进行分组得到:
MapReduce:18,803ms
聚合框架:1,535ms
这些与我以前的实验非常吻合。
我的基准:
==数据生成==
生成400万行(与python)容易与约350字节。 每个文件都有这些键:
- key1,key2(两个随机列testing索引,一个基数为2000,一个基数为20)
- longdata:用于增加每个文档大小的长string
- 值:一个简单的数字(常量10)来testing聚合
db = Connection('127.0.0.1')。test#mongo连接 random.seed(1) 在范围内(2): key1s = [hexlify(os.urandom(10))。decode('ascii')for _ in range(10)] key2s = [hexlify(os.urandom(10))。decode('ascii')for _ in range(1000)] baddata ='一些长date'+'*'* 300 我在范围(2000年): data_list = [{ 'key1':random.choice(key1s), 'key2':random.choice(key2s), 'baddata':baddata, “价值”:10, (1000)] 对于data_list中的数据: db.testtable.save(数据)
mongo中的总数据大小约为6GB。 (和postgres 2GB)
==testing==
我做了一些testing,但是比较结果就足够了:
注意:服务器重新启动,并且在每次查询后清理OScaching,以忽略caching的效果。
QUERY:将key1=somevalue
(大约200K行)的所有行和每个key2
总和value
进行聚合
- 地图/减less10.6秒
- 累计9.7秒
- 组10.3秒
查询:
的map / reduce:
db.testtable.mapReduce(function(){emit(this.key2, this.value);}, function(key, values){var i =0; values.forEach(function(v){i+=v;}); return i; } , {out:{inline: 1}, query: {key1: '663969462d2ec0a5fc34'} })
骨料:
db.testtable.aggregate({ $match: {key1: '663969462d2ec0a5fc34'}}, {$group: {_id: '$key2', pop: {$sum: '$value'}} })
组:
db.testtable.group({key: {key2:1}, cond: {key1: '663969462d2ec0a5fc34'}, reduce: function(obj,prev) { prev.csum += obj.value; }, initial: { csum: 0 } })
正如你在这个博客中看到的,聚合比map-reduce快6倍。