Mongodb Aggregation框架比map / reduce更快吗?

时间:2012-12-17 04:53:35

标签: performance mongodb mapreduce aggregation-framework

mongodb 2.2中引入的聚合框架是否比map / reduce有任何特殊的性能改进?

如果是,为什么,如何以及多少?

(我已经为自己做了一个测试,性能几乎相同)

2 个答案:

答案 0 :(得分:63)

我亲自运行的每项测试(包括使用您自己的数据)都显示聚合框架比map reduce快多倍,并且通常要快一个数量级。

只取你发布的数据的十分之一(但不是清除操作系统缓存,首先加热缓存 - 因为我想测量聚合的性能,而不是测量数据页面所需的时间)我得到了这样:

MapReduce:1,058ms
聚合框架:133ms

从聚合框架中删除$ match,从mapReduce中删除{query:}(因为两者都只使用索引,而不是我们想要测量的),并按key2对整个数据集进行分组:

MapReduce:18,803ms
聚合框架:1,535ms

这些与我以前的实验非常吻合。

答案 1 :(得分:7)

我的基准:

==数据生成==

使用大约350个字节轻松生成400万行(使用python)。 每个文档都有这些键:

  • key1,key2(测试索引的两个随机列,一个基数为2000,一个基数为20)
  • longdata:用于增加每个文档大小的长字符串
  • value:一个简单的数字(const 10)来测试聚合

db = Connection('127.0.0.1').test # mongo connection
random.seed(1)
for _ in range(2):
    key1s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(10)]
    key2s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(1000)]
    baddata = 'some long date ' + '*' * 300
    for i in range(2000):
        data_list = [{
                'key1': random.choice(key1s),
                'key2': random.choice(key2s),
                'baddata': baddata,
                'value': 10,
                } for _ in range(1000)]
        for data in data_list:
            db.testtable.save(data)
mongo的总数据大小约为6GB。 (和postgres的2GB)

==测试==

我做了一些测试,但有一个足以比较结果:

注意:重新启动服务器,并在每次查询后清除操作系统缓存,以忽略缓存的影响。

QUERY:汇总key1=somevalue(约200K行)的所有行,并为每个value汇总key2

  • map /减少10.6秒
  • 聚集9.7秒
  • 组10.3秒

<强>查询:

地图/降低:

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 } })