小编Eri*_*vez的帖子

MongoDB聚合框架性能比数百万个文档慢

背景

我们的系统是运营商级并且非常强大,它经过负载测试以处理每秒5000个事务,并且对于每个事务,文档被插入到单个MongoDB集合中(在此应用程序中没有更新或查询,它是只写的).这相当于每天约700MM的文件,这是我们的基准.

MongoDB部署尚未分片,我们有1x replicaset,1个master和2个slave,所有这些都是ec2上的m2.2xlarge类型.每个实例都由1TB RAID0条带支持,该条带由8个卷组成(无PIOPS).我们使用带有c ++本机BSON解析器的nod​​e-mongodb-native驱动程序来获得最佳写入性能,并尝试相应地对文档结构建模.

注意

  • 文件很小(120字节)
  • 该文件包括"时间桶"(h [我们],d [ay],m [onth],y [ear])以及"t [ime]"字段
  • 我们在集合上有一个索引,用"c [ustomer]"和"a"查询,这是一个高度随机但非唯一的标签
  • 我们已经考虑将数据分区为单独的集合,但在此示例中,所有数据都很热.
  • 我们也在研究预聚合,尽管这不能实时完成.

需求

  • 对于报告,我们需要计算每月唯一"a"标记的数量,以及客户在任何给定时期内的总数
  • 报告需要大约60秒来运行2小时内存储的9.5MM文档的样本(完整集合).详情如下:

文献

{
  _id: ObjectID(),
  a: ‘string’,
  b: ‘string’,
  c: ‘string’ or <int>,
  g: ‘string’ or <not_exist>,
  t: ISODate(),
  h: <int>,
  d: <int>,
  m: <int>,
  y: <int>
}
Run Code Online (Sandbox Code Playgroud)

指数

col.ensureIndex({ c: 1, a: 1, y: 1, m: 1, d: 1, h: 1 });
Run Code Online (Sandbox Code Playgroud)

聚合查询

col.aggregate([
    { $match: { c: 'customer_1', y: 2013, m: 11 } },
    { $group: { _id: …
Run Code Online (Sandbox Code Playgroud)

indexing mapreduce mongodb aggregation-framework

15
推荐指数
2
解决办法
8055
查看次数