0

我一直在尝试根据一些日志文件(约 5000 万条记录,并且可以增长十倍)来制作一些报告 - 我已将其加载到表中并进行必要的更改(删除重复数据等) - 的表应该包含每种类型和每天每种产品的请求数,因此我试图将其缩减为仅具有表示请求数的计数列的不同产品

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

*************************** 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 表”-我已更改临时目录以留出足够的空间-任何指针?

提前致谢

4

1 回答 1

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

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

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


您正在做的是创建一个数据仓库。考虑强烈地将这些数据放在单独的专用服务器上。这样做有很多好处 - 阅读以了解什么。

于 2012-06-03T19:07:01.403 回答