最近项目中需要实现一个功能,定时更新数据库中不正常的数据,因为服务器是windows的,所以linux的crontab不可用,而windows的bat调用感觉不太好,框架用的是tp5,tp框架定时任务总是要主动触发才能生效,所以最终选择了mysql的事件调度器结合触发器实现。
1:查看mysql是否开启了事件,如果是OFF或者0,表示是关闭的。
show VARIABLES LIKE '%sche%'; //查看状态
SET GLOBAL event_scheduler = 1 //开启
2:创建event要调用的存储过程demo-proce
delimiter //
drop procedure if exists demo_proce//
create procedure demo_proce()
begin
update demo set status=0 where (status=1) and (unix_timestamp(now()) -modify_time)>30;
end//
delimiter ;
3:创建事件demo_event(每10秒自动调用存储过程)
create event demo_event
on schedule every 10 second
on completion preserve disable
do call demo_proce();
4:开启事件demo_event
alter event demo_event on completion preserve enable;
5:关闭事件demo_event
alter event demo_event on completion preserve disable;
6:查看创建的event
select * from mysql.event;
整个过程大概就是这样的,经过测试能用,但是不知道执行效率怎么样,也不知道怎么测试同linux的定时任务效率,但是感觉应该执行效率会好点,因为mysql的底层是c语言开发的,每次操作sql语句,要先编译成c语言,但是结合了存储过程,只需要编译一次就可以了,所以从这方面来看,使用事件调度效果会好些。(其实我是菜鸟,瞎猜的)