55

mongodb 2.2引入的聚合框架,对map/reduce有什么特别的性能提升吗?

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

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

4

2 回答 2

66

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

只取您发布的数据的 1/10(但不是清除操作系统缓存,而是先预热缓存 - 因为我想测量聚合的性能,而不是在数据中分页需要多长时间)我得到了这个:

MapReduce:1,058 毫秒
聚合框架:133 毫秒

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

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

这些非常符合我之前的实验。

于 2012-12-17T10:15:05.657 回答
8

我的基准:

== 数据生成 ==

用大约 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

  • 映射/减少 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 } })

于 2012-12-17T09:23:15.767 回答