我们正在MySQL数据库上运行一个自定义的OpenX广告服务器。每天100万次点击。我们需要存储所有这些点击信息并根据它显示统计信息。
现在,所有点击信息每2天汇总一次,并删除特定的点击信息。但我们希望为我们的关联企业提供一项新功能,以便他们设置动态跟踪ID(TID),并基本上根据此跟踪他们的点击次数和转化次数。
所以,问题是我们的点击表每天至少会增加100万个条目,我们需要能够搜索此表并显示特定时间段内一个用户的所有点击次数,分组通过我上面提到的TID,或通过TID进行搜索。
我看了一下MySQL分区,它似乎是一个很好的解决方案,但是,我不确定它是否仍能在巨大的数据库上运行(可能是数十亿条目)。
您认为这个问题的正确方法是什么?
修改
根据你的答案,我现在正在考虑一个混合解决方案。
我们已经有一个“LIVE”表,在维护时聚合点击时会删除这些条目,如下所示:
表:点击次数
viewer_id | ...... | date_time | affiliate_id | ...... | TID
(我跳过了此时不重要的列)
在维护时,我可以将所有内容移至另一个看起来几乎相同的月度表,例如表:clicks_2012_11 ,其中包含 date_time , affiliate_id的索引和 tid ,并按 affiliate_id 进行分区。
现在,当联盟会员想要查看过去2个月的统计数据时,我知道我必须查看表格:clicks_2012_10 和表格:clicks_2012_11 (我的时间范围限制为最多2个月)。因为我有 affiliate_id 分区的表格,所以只会从2个表格中搜索所需的分区,现在我可以列出过去2个月内有任何活动的所有TID。
您如何看待这种方法?有没有明显的问题?我是否因为没有坚实的理由而使事情复杂化?
答案 0 :(得分:2)
大型(甚至“巨大”)表中没有任何固有的东西可以使MySQL失败。大表几乎是一个问题:
您需要解决所有这些问题。
分区主要用于批量数据维护,例如删除整个分区。默认情况下,在某些列上对大表进行分区当然不是最佳做法。始终出于特定原因引入分区。
答案 1 :(得分:1)
优化插入和优化检索通常是互斥的。使用两个表格可能会更好:
live data: no (or minimal) keys, myisam to remove transaction overhead, etc...
historical data: indexed up the wazoo, with data moved over from the live data on a periodic basis.