Performance 分片环境中的Mongodb聚合性能问题
我有从mongo(超过1000万个文档)提取分析数据并生成报告的遗留代码。它的工作速度非常慢,因为当前代码大量使用聚合($unwind、$sum、$group等) 以下是旧集合中的文档的外观:Performance 分片环境中的Mongodb聚合性能问题,performance,mongodb,sharding,Performance,Mongodb,Sharding,我有从mongo(超过1000万个文档)提取分析数据并生成报告的遗留代码。它的工作速度非常慢,因为当前代码大量使用聚合($unwind、$sum、$group等) 以下是旧集合中的文档的外观: { serverId: 'srv1', dateVisited: '2014-12-24', campaignId: 'c1', ... landingpageClicks: [ {...}, {...} ], offerTrackings: [ {
{
serverId: 'srv1',
dateVisited: '2014-12-24',
campaignId: 'c1',
...
landingpageClicks: [
{...},
{...}
],
offerTrackings: [
{
amount: 10
},
{
amount: 22
}
{
amount: 18
}
]
}
为了从这样的集合中获取统计信息,以前的程序员使用$match、$unwind、$group和$sum。我将此集合映射为新集合,现在看起来如下所示:
{
_id: {
serverId: 'srv1',
dateVisited: '2014-12-24',
campaignId: 'c1'
},
value: {
landingpageClicksCount: 2,
offerTrackingsCount: 3,
offerTrackingsAmount: 50
}
}
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
结果,我的新集合缩小了两倍,但当我需要获取特定日期(所有服务器和活动)的统计数据时,我仍然必须使用聚合$组不支持索引,所以查询速度仍然非常慢
我已经设置了3个节点的切分(本地,两个节点都在同一台机器上),但是现在查询速度慢了两倍!
printShardingStatus()显示块分布在所有3个节点之间。但为什么它现在变得慢得多呢
另外,我对切分设置非常陌生,我不确定我的切分键是否正确:
{
'_id.serverId': 1,
'_id.dateVisited': 1,
'_id.campaignId': 1'
}
[更新]聚合以收集特定日期的统计数据(不通过多个参数分组):
用户还可以按多个字段请求分组,例如组、日期、服务器ID、活动ID和报告应如下所示:
{
_id: {
serverId: 'srv1',
dateVisited: '2014-12-24',
campaignId: 'c1'
},
value: {
landingpageClicksCount: 2,
offerTrackingsCount: 3,
offerTrackingsAmount: 50
}
}
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
你为什么要设置sharding?纯粹为了加速聚合?我们能看到聚合吗?我用聚合查询示例和所需输出示例更新了我的帖子。是的,我需要加快聚合速度。find()可以很好地处理索引,但聚合仍然是有效的slow@wdberkeley,分片是否有助于加速聚合?您是否有关于
\u id.datevisted
的索引?此外,如果是日期,则最好将其存储为日期类型。切分可以改进聚合的某些部分,例如在某些条件下的$match
阶段,但它对$group
阶段没有真正的帮助。这不是切分的好理由。是的,我已经在\u id.datevisted
上创建了索引db.clicks.find({u id.datevisted':'XXX-XX-XX')
足够快,但聚合速度非常慢。我不知道如何加快速度。