我设计了一个应用程序来分析一个城市不同地方的计数频繁数据。
我为每个计算网站设置了一个数据表(以下简称DT
),如下所示:startDate
(DATETIME),dataCount
(INT)。
每条记录包含计数的开始日期和计数器的前端访问次数。每条记录的接收数量都很清楚。记录间隔取决于计数器(一般每小时数据)。
我有一个表格(以下简称resumeDT
)来概括我的所有点算网站:名称,dateReference
,location
,description
...和{{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)
你有任何建议或其他解决方案吗?
提前感谢您的帮助。
答案 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)的工具
https://mariadb.com/kb/en/library/flexviews/
请记住,二进制日志在事务提交后才会“有效”/“有用”,因此,如果您的CDC处理此问题,可能会发生延迟。最好检查一下