Mariadb(mysql)定时任务的使用

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;

注意事项

由于这里涉及到执行时间问题,所以时区一定要确定,具体时区的配置请参看上一篇


上一篇
基于SpringBoot+Redis的Session共享与单点登录 基于SpringBoot+Redis的Session共享与单点登录
基于SpringBoot+Redis的Session共享与单点登录前言使用Redis来实现Session共享,其实网上已经有很多例子了,这是确保在集群部署中最典型的redis使用场景。在SpringBoot项目中,其实可以一行运行代码都不用
2019-07-23
下一篇
Mariadb(mysql)默认时区处理及docker运行配置 Mariadb(mysql)默认时区处理及docker运行配置
Mariadb(mysql)默认时区处理及docker运行配置查看时区和当前时间12show variables like "%time_zone%";select now(); 临时修改时区123set global
2019-07-15