大刀片的加工速度更快

时间:2018-12-10 23:59:01

标签: mysql performance

我正在使用MySQL处理具有四个列(两个varchar,一个int和一个键)的大型日志文件(大约3亿条记录),但这需要很长时间。

目标是挖掘日志文件并查找频繁采取特定行动的记录。

在高于任意eventID的事件中以A或U状态记录。我正在使用GROUP BY将它们插入到新表中,这需要花费一整天的时间。有办法更快地做到这一点吗?

INSERT INTO `tbl_FrequentActions`(`ActionCount`, `RecordNumber`)
SELECT
COUNT(`idActionLog`) as 'ActionCount',
`RecordNumber`
FROM `ActionLog`
WHERE (`ActionStatus` like 'D' or `ActionStatus` like 'U') AND
`EventID` > 103
GROUP BY `RecordNumber`
HAVING COUNT(`idActionLog`) > 19
;

使用临时表单独运行WHERE参数会更快。就像创建临时表以在我运行GROUP BY之前减少所有事情一样?

ActionLog中的所有字段都已建立索引。

编辑:所有数据已经​​在一个表的日志数据库中。有人提到我早些时候在这方面是模棱两可的。

索引是该列的索引。

EDIT2:   有人问我的日志文件缓冲区是否针对这种大小的文件进行了正确配置,这是一个很大的问题,但我不知道。是的,它是InnoDB格式。

我建立了一个包含几百万条记录的测试表,并在该表上运行查询。花了1分钟30秒。我将查询分解为使用临时表来处理所有where子句,然后在临时表上运行GROUP BY查询。那把时间缩短到不到一分钟。这样可以节省几个小时。

EDIT3 :   我可以使用“ ON DUPLICATE UPDATE”来加快速度吗?我试过了,但它永远运行了。我认为这是笛卡尔错误。我需要以某种方式对表进行别名吗?

INSERT INTO `tbl_FrequentActions`(`ActionCount`, `RecordNumber`)
SELECT
'1' as 'ActionCount',
`RecordNumber`
FROM `ActionLog`
WHERE (`Status` like 'D' or `Status` like 'U') AND
`EventID` > 103
ON DUPLICATE KEY UPDATE
`DeliveryCount` = (`DeliveryCount` + 1)
;

1 个答案:

答案 0 :(得分:1)

这听起来像是数据仓库应用程序的“标准”摘要表。我将陈述一些假设,然后讨论如何做到这一点。结果查询可能需要一个小时;可能只需要几分钟。

  • ActionLog很大,但是只是“添加”到了。您永远不会UPDATEDELETE数据(也许是为了淘汰旧数据)。
  • “任意eventID”实际上是更常规的内容,例如“某天的开始”。

首先,您需要将300M的大多数行汇总到汇总表中。然后,每天(或每小时?)对 new 数据进行汇总-这是一个相当快的操作。或者,可以使用IODKU。在决定选择哪一个之前,我们需要了解插入ActionLog的频率。 (可能很快。)日志条目是否成批出现?一次还是一次?

然后,将对Summary表执行'report'查询,并且比对'Fact'表(ActionLog)运行要快得多。

典型的摘要表在EventDate >= '2018-04-01'而不是EventID > 103下工作。因此,在了解“ 103”的来源时,我需要一些帮助。

Status有多少个不同的值?我们需要在多行和多列之间做出决定。

要进一步了解我的去向,请执行以下操作: Summary TablesHigh speed ingestion