分片环境中的Mongodb聚合性能问题

时间:2014-12-24 11:49:03

标签: performance mongodb sharding

我有遗留代码从mongo(超过1000万个文档)中提取分析数据并构建报告。它工作得非常慢,因为当前代码大量使用聚合($ unwind,$ sum,$ group等)

以下是旧馆藏中的文档:

{
  serverId: 'srv1',
  dateVisited: '2014-12-24',
  campaignId: 'c1',
  ...
  landingpageClicks: [
    {...},
    {...}
  ],
  offerTrackings: [
    {
      amount: 10
    },
    {
      amount: 22
    }
    {
      amount: 18
    }
  ]
}

为了从这样的收集中获取统计数据,之前的程序员使用$ match,$ unwind,$ group和$ sum。我将这个集合mapreduced为新集合,现在看起来像这样:

{
  _id: {
      serverId: 'srv1',
      dateVisited: '2014-12-24',
      campaignId: 'c1'
  },
  value: {
    landingpageClicksCount: 2,
    offerTrackingsCount: 3,
    offerTrackingsAmount: 50
  }
}

结果,我的新系列变小了两倍,但是当我需要为特定日期(对于所有服务器和广告系列)提取统计数据时,我仍然需要使用聚合。 $ group不支持索引,因此查询仍然非常慢。

我已经设置了3个节点的分片(本地,两者都在同一台机器上),但现在查询速度慢了两倍! db.printShardingStatus()显示块在所有3个节点之间分布。但为什么现在变慢了呢?

P.S。我对分片设置很新,而且我不确定我的分片键是否合适:

{
  '_id.serverId': 1,
  '_id.dateVisited': 1,
  '_id.campaignId': 1'
}

[已更新] 汇总以收集特定日期的统计信息(不包括多个参数):

db.clicks.aggregate([
  {$match: {'_id.dateVisited': '2014-12-24'}},
  {$group:{
    _id: '$_id.dateVisited',
    totalLandingpageClicksCount: {$sum: '$value.landingpageClicksCount'},
    totalOfferTrackingsCount: {$sum: '$value.offerTrackingsCount'},
    totalOfferTrackingsAmount: {$sum: '$value.offerTrackingsAmount'}
  }}
])

用户也可以通过多个字段请求灌浆,例如group by date,然后是serverId,然后是campaignId,report应该如下所示:

2014-12-24    |  50 lp clicks  |  21 offer clicks  | $600 // srv1 + srv2
  srv1        |  20 lp clicks  |  11 offer clicks  | $400 // campaign1 + campaign2
    campaign1 |  10 lp clicks  |   6 offer clicks  | $100
    campaign2 |  10 lp clicks  |   5 offer clicks  | $300
  srv2        |  30 lp clicks  |  10 offer clicks  | $200 // campaign3 + campaign4
    campaign3 |  20 lp clicks  |   4 offer clicks  | $100
    campaign4 |  10 lp clicks  |   6 offer clicks  | $100

0 个答案:

没有答案