Mariadb(mysql)定时任务的使用
需求描述
随时系统数据量的增加,在原系统中本来使用的一个视图,发现越来越影响性能了,本来该视图只是临时使用的,结果一搜索代码,发现已经有很多地方使用到了,修改代码的工作量太大,并且该视图使用的数据对实时性要求并不高,于是将该视图的内容处理成表,查询速度一下就提供上去了。
查看是否开启了计划事件
1
| SHOW VARIABLES LIKE 'event_scheduler';
|
临时开启与关闭
只需要将on改为off,把1改为0即可实现关闭。
1 2 3 4
| SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1;
|
计划事件语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| CREATE [DEFINER = user] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'string'] DO event_body;
schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...]
interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
|
使用样例
每天临晨1点执行指定存储过程,在该存储过程中删除原数据,再从之前的视图中将数据insert到指定表中。
1 2 3 4 5
| CREATE EVENT if not exists event_update_data on schedule EVERY 1 DAY STARTS '2019-07-16 00:01:00' on completion preserve ENABLE do call P_update_data();
|
视图数据到表示例
1 2 3 4 5 6 7
| #直接用视图生成表,这样最简单,但有一样不好,没有索引和主键等。 drop table T1; create table T1 select * from V1;
#另一种,先根据视图建好表,并建立索引等,再用insert into T1 select * from V1; TRUNCATE T1; insert into T1 select * from V1;
|
注意事项
由于这里涉及到执行时间问题,所以时区一定要确定,具体时区的配置请参看上一篇