我们使用mongo在我们的网站上记录活动,但是现在我们的流量已经增长,我们正在努力提取我们想要的报告。我们达到了超时。每个用户会话都有自己的记录,其中包括以下属性 -
query_data = (name,)
我们运行了大量的AB测试,并希望了解不同版本如何影响用户活动。所以我们可能会运行像
这样的查询query_data
或
{
channel: 'adwords',
device: {
type: 'mobile'
},
abTestArms: [
test1_arm2,
test3_arm4
],
userEventCounters: {
clickOnRedButton: 3,
adjustPriceSlider: 4,
clickOnBlueButton: 2,
useSearchBox: 4
}
}
我们曾经使用聚合管道,但是他们开始超时,所以现在我们正在逐步建立结果,但即使这样,我们也会遇到超时。
我们尝试了各种不同的索引,例如
等复合索引db.sessions.count({channel:'bing',device:'tablet',abTestArms:'test1_arm1','userEventCounters.useSearchBox':{$exists:true}})
我们唯一没有尝试的是创建许多复合索引,如
db.sessions.count({channel:'bing',device:'tablet',abTestArms:'test1_arm1'})
这个问题是我们跟踪的用户事件很多,我们不希望像这样的40多个复合索引。此外,每当我们跟踪新事件时,我们都必须创建新索引。
我们目前在我们的数据库中保留大约3个会话,而更大的计数查询通常在100k。这可能不是一件不寻常的事情,理想情况下我希望能够动态地完成这些工作(就像我们以前在交通水平很小的时候那样)。我错过了什么?