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倍。