mongoDB去重操作性能指标

最近刚完成mongoDB的压力测试,单集合内拥有2亿条数据。2亿多的数据量跑一次聚合操作会是怎么样的结果呢?

我们的测试环境还是老机器配置(5台分片集群、至强3.3GHZ、16G内存),集合依据上篇文章的结果不做索引。而实验的聚合操作可参考以前的文章。使用3个stage操作将集合中重复的用户统计。

db.user.aggregate([
  {
    $match: {
      'Receiver_date': { //范围为所有数据
        $gte: ISODate('2015-01-01T04:00:00Z'), 
        $lt: ISODate('2013-03-01T04:00:00Z')
      }
    }
  },
  {
    $group: {
      '_id': {
        'Receiver_name': '$Receiver_name',
        'Receiver_mobile': '$Receiver_mobile'
      },
      'count': {
        $sum: 1
      }
    }
  },
  {
    $sort: {
      "count": -1
    }
  }
], { allowDiskUse: true});

我们统计处理量和运行时间,并计算出每次聚合的平均速度,其结果如下图。实验结果表明速度和数据量大概是一种对数关系。聚合操作是一种管道操作,其处理中间量会暂存在临时集合中。当硬件资源(比如说内存和磁盘IO)跟不上,处理速度当然就会降下去。不要忘记了我们展示的是平均速度,在处理过程的后期处理能力一定已经很低了。

mongoDB去重性能指标

那这个时候需要做什么呢?“scale out”和“scale up”就是两种不同的选择。而据说mongoDB3.0使用了新的引擎,性能还能够得到提升,那么我何不更新mongoDB的版本呢?这也是我们下一步想尝试的内容。