来自大型数据集的报告 - Mysql

时间:2012-06-03 18:18:16

标签: mysql

我一直在尝试根据一些日志文件计算出一些报告(大约5000万条记录,并且可能会增长十倍) - 我已将其加载到表中并进行必要的更改(删除重复等) ) - 该表应该保存每种类型和每天每个产品的请求数,因此我试图将其减少到只有不同的产品,其中count列表示请求数

以下是包含日志数据的原始表:

*************************** 1. row ***************************
       Table: cdnlog2
Create Table: CREATE TABLE `cdnlog2` (
  `serial` int(32) DEFAULT NULL,
  `ip` varchar(100) DEFAULT NULL,
  `country` varchar(100) DEFAULT NULL,
  `productid` int(11) DEFAULT NULL,
  `type` varchar(100) DEFAULT NULL,
  `query_date` date DEFAULT NULL,
  KEY `aaa` (`country`),
  KEY `ccc` (`productid`),
  KEY `type` (`type`),
  KEY `date_index` (`query_date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

目的地表:

*************************** 1. row ***************************
       Table: cdnlogfinal
Create Table: CREATE TABLE `cdnlogfinal` (
  `country` varchar(100) DEFAULT NULL,
  `productid` int(11) DEFAULT NULL,
  `type` varchar(100) DEFAULT NULL,
  `request_count` int(11) DEFAULT NULL,
  `query_date` date DEFAULT NULL,
  KEY `aaa` (`country`),
  KEY `ccc` (`productid`),
  KEY `type` (`type`),
  KEY `date_index` (`query_date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

我现在尝试将记录数量减少到只有不同行及其计数的分组值(日志可以包含重复项,因为同一产品可以在同一天多次选择),但是,插入到一个辅助表已经运行了几个小时,状态为“复制到磁盘上的tmp表” - 我已经更改了临时目录以允许足够的空间 - 任何指针?

提前致谢

1 个答案:

答案 0 :(得分:0)

您的想法很好,最终结果会极大地加快您的报告查询速度。你只需要一件就可以解决这个难题:

问题是基表中有太多行要在一个查询中创建派生表中的所有行 - 事务需要这么长时间,并且创建的行数太大,它超时和/或超出了交易的日志空间。

相反,你必须每天做一次:

insert into cdnlog2 (country, productid, type, query_date)
select country, productid, type, date(transaction_time)
from cdnlog
where transaction_time between '2012-01-01 00:00:00' and '2012-01-01 23:59:59'
group by country, productid, type

针对数据范围中的每一天单独运行此查询,相应地更改开始/结束时间戳。

计算完历史数据后,作为批处理的一部分,每天运行一次,作为批处理的一部分。


你正在做的是创建一个data warehouse。考虑将这些数据强烈地放在一个单独的专用服务器上。这样做有很多好处 - 请阅读以找出答案。