汇总MySQL数据的建议(数百万行)

时间:2012-09-30 17:48:17

标签: mysql aggregate

有人可以推荐一种策略,用于汇总存储在超过100,000,000行的MySQL表中的原始“点击”​​和“展示”数据吗?

这是表结构。

CREATE TABLE `clicks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `companyid` int(11) DEFAULT '0',
  `type` varchar(32) NOT NULL DEFAULT '',
  `contextid` int(11) NOT NULL DEFAULT '0',
  `period` varchar(16) NOT NULL DEFAULT '',
  `timestamp` int(11) NOT NULL DEFAULT '0',
  `location` varchar(32) NOT NULL DEFAULT '',
  `ip` varchar(32) DEFAULT NULL,
  `useragent` varchar(64) DEFAULT NULL,
  `processed` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `type` (`type`),
  KEY `companyid` (`companyid`),
  KEY `period` (`period`),
  KEY `contextid` (`contextid`)
) ENGINE=MyISAM AUTO_INCREMENT=21189 DEFAULT CHARSET=latin1;

我想要做的是让这些数据更容易使用。我想从中提取每周和每月的聚合,按类型,companyid和contextid分组。

理想情况下,我想从生产服务器上取下这些数据,将其聚合然后再合并。

我真的有点挑剔,想知道是否有人有任何好的起点或实际聚合数据的策略,以便可以使用MySQL快速查询。我不要求对这些数据进行“实时”报告。

我过去曾尝试批量PHP脚本,但这看起来很慢。

2 个答案:

答案 0 :(得分:1)

您可以使用整个月/周数据聚合逻辑实现一个简单的PHP脚本,并使其在给定时间通过cron作业执行。根据软件环境,可能会安排在晚上运行。此外,您可以在请求中传递GET参数以识别请求源。

答案 1 :(得分:0)

您可能对MySQL复制感兴趣...设置第二台服务器,其唯一的工作就是在数据集的复制副本上运行报告,因此您可以专门针对该作业进行调整。如果将复制方案设置为主 - 主,则当报表服务器根据报表结果更新其自己的表时,这些数据库更改将自动复制回生产服务器。

此外,我强烈建议您阅读High Performance MySQL, 3rd Ed.,并查看http://www.mysqlperformanceblog.com/以获取有关在MySQL中使用大量数据集的更多信息