mysql触发器"没有"对于每一行

时间:2014-06-13 09:27:23

标签: mysql triggers

我设计了一个应用程序来分析一个城市不同地方的计数频繁数据。

我为每个计算网站设置了一个数据表(以下简称DT),如下所示:startDate(DATETIME),dataCount(INT)。
每条记录包含计数的开始日期和计数器的前端访问次数。每条记录的接收数量都很清楚。记录间隔取决于计数器(一般每小时数据)。

我有一个表格(以下简称resumeDT)来概括我的所有点算网站:名称,dateReferencelocationdescription ...和{{1 }}

我想创建一个这种类型的触发器:

dailyAvg

对我来说有点麻烦的是,如果我一次插入500个值,我将再执行500次UPDATE。我想在结束时只执行一次更新查询 我知道CREATE TRIGGER avgDT AFTER UPDATE,INSERT,DELETE ON DT FOR EACH ROW UPDATE resumeDT SET avg= (SELECT AVG(tmp.sum) FROM (SELECT sum(count) FROM DT GROUP BY DATE(date)) tmp) WHERE dateReference="DT" 在触发器的语法中是强制性的,但是我能找到一种解决方法来做我想要的吗?

也许只使用触发器来增加一个mysql变量FOR EACH ROW并调用一个每秒扫描@DTChanged的外部脚本。 @DTChanged(1s没有插入或更新)=>更新if (@DTChanged!= 0 and lastDTChanged==@DTChanged)
你有任何建议或其他解决方案吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

关于触发器的问题是一个叫做RBAR(Row By Agonizing Row)的概念。标准触发器(最常用,易于实现)通常是基于行的

https://www.sqlservercentral.com/Forums/Topic642789-338-1.aspx

我不知道基于语句的MySQL触发器。但它们确实存在于其他数据库引擎(RDBMS) https://en.wikipedia.org/wiki/Database_trigger

此案例的解决方案

1)在其他数据库上,有一个名为Materialized Views的标准功能。自动更新的可以满足您的需求。问题是,对于表上的每个更新完成,它将触发刷新,需要资源和时间来完成,这将影响您的交易时间。有些数据库(如DB2)甚至可以使用汇总数据进行查询,甚至不会引用汇总表,因为它具有优化器功能。

2)关于MySQL,考虑到它的开放性,它可以在事务/二进制日志上进行范围,其中记录了对数据库的所有更改(这也称为流处理)。此信息的范围称为(二进制日志)更改数据捕获。下面的工具maxwells-daemon允许您捕获和处理到目前为止所做的更改。甚至还有另一种模拟物化视图(flexviews)的工具

http://maxwells-daemon.io/

https://www.percona.com/blog/2014/08/27/trawling-the-binlog-with-flexcdc-and-new-flexcdc-plugins-for-mysql/

https://mariadb.com/kb/en/library/flexviews/

请记住,二进制日志在事务提交后才会“有效”/“有用”,因此,如果您的CDC处理此问题,可能会发生延迟。最好检查一下