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

来自大型数据集的报告-Mysql,mysql,Mysql,我一直在尝试根据一些日志文件编制一些报告(约5000万条记录,未来可能会增长十倍)-我将其加载到一个表中,并进行必要的更改(删除DUP等)-该表应包含每种类型和每天每种产品的请求数,因此,我试图将其简化为具有计数列的不同产品,该列表示请求的数量 以下是包含日志数据的原始表: *************************** 1. row *************************** Table: cdnlog2 Create Table: CREATE TABLE

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

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

*************************** 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
我现在正试图将记录数减少为仅包含不同行及其计数的分组值(日志可以包含DUP,因为同一产品可以在同一天多次选择),但是,插入到辅助表中的操作已运行数小时,状态为“复制到磁盘上的tmp表”-我已更改临时目录以留出足够的空间-有指针吗


提前感谢

您的想法很好,最终结果将大大加快您的报告查询速度。你只需要再多拿一块来解决这个难题:

问题是基表中的行太多,无法在一个查询中创建派生表中的所有行-事务耗时太长,创建的行数太多,导致超时和/或超出事务的日志空间

相反,您必须每天都这样做:

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
在数据范围内每天单独运行此查询,相应地更改开始/结束时间戳

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



你所做的是创造一个新的世界。考虑将这些数据强加到单独的专用服务器上。这样做有很多好处-请仔细阅读以找出原因。

请发布您的查询和目标表的
CREATE TABLE
。此外,为什么您没有接受您之前提出的问题的任何答案?添加了目标表-抱歉,我以为我接受了(事实证明我没有接受)标记已接受的答案-立即完成-感谢您将OUTISERT指向cdnlogfinal select country,productid,type,count(*),从cdnlog2查询\u date,其中查询\u date='2011-11-01'按国家分组,productid,type,query \u date即使使用where子句,我也会得到相同的“复制到磁盘上的临时表”查询只运行了几个小时——这是我在每个日期看到的:`按查询日期从cdnlog2组中选择查询日期,count();+-------------+--+|查询|日期|计数()——————————我的工作原理是:将原始数据导入一个非索引表(一次只导入一天的数据),然后导入一个只包含关键字段的表(加载后清理需要有索引并在下一步引用的字段)-最后一个汇总表批量加载清理后的数据(我一次选择一种类型并对重复项进行分组)-这显著减少了记录的数量