8

我们正在一个 MySQL 数据库上运行一个自定义 OpenX 广告服务器,该服务器大约为 . 100 万次点击/天。我们需要存储所有这些点击信息并根据它显示统计信息。

目前,所有点击信息每 2 天汇总一次,并删除特定点击信息。但是我们希望为我们的附属公司提供一项新功能,该功能将允许他们设置动态跟踪 ID (TID),并且基本上可以基于此跟踪他们的点击和转化。

所以,问题是我们的点击表每天至少会增长 100 万个条目,我们需要能够搜索这个表并显示一个用户在特定时间段内的所有点击,按 TID 分组我上面提到的,还是按TID搜索的。

我查看了 MySQL 分区,它似乎是一个很好的解决方案,但是,我不确定它是否仍能在巨大的数据库(可能有数十亿个条目)上正常工作。

您认为解决此问题的正确方法是什么?

编辑:

根据您的回答,我现在正在考虑一个混合解决方案。

我们已经有一个“LIVE”表,当在维护时聚合点击时,条目会从该表中删除,如下所示:

表:点击次数

查看器_id | ... | 日期时间 | 附属ID | ... | 时间

(我跳过了此时不重要的列)

在维护时,我可以将所有内容移到另一个看起来几乎相同的月度表中,例如Table: clicks_2012_11,它具有date_timeaffiliate_idtid的索引,并由affiliate_id分区。

所以现在,当一个会员想要查看他过去 2 个月的统计数据时,我知道我必须查看表格:clicks_2012_10表格:clicks_2012_11(我将时间范围限制为最多 2 个月)。因为我有按affiliate_id分区的表,所以只会从2 个表中搜索所需的分区,我现在可以列出过去2 个月内有任何活动的所有TID。

您如何看待这种方法?有什么明显的问题吗?我是否在没有充分理由的情况下过度复杂化了事情?

4

2 回答 2

2

大(甚至是“巨大”)表中没有任何固有的东西会使 MySQL 失败。大表在以下方面主要是一个问题:

  • 磁盘空间
  • 缓存使用(您可能无法在内存中运行)
  • 维护(架构更改,重建,...)

您需要解决所有这些问题。

分区主要用于批量数据维护,例如删除整个分区。默认情况下仅在某些列上对大表进行分区当然不是最佳实践。总是出于特定原因引入分区。

于 2012-10-29T14:11:34.857 回答
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.
于 2012-10-29T14:16:09.027 回答