我一直在尝试根据一些日志文件计算出一些报告(大约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表” - 我已经更改了临时目录以允许足够的空间 - 任何指针?
提前致谢
答案 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。考虑将这些数据强烈地放在一个单独的专用服务器上。这样做有很多好处 - 请阅读以找出答案。