SQL语言首先是一门编程语言,其次才是查询语言,它可以通过存储过程来实现复杂的数据操作。
有一个计划任务的需求,仅单纯的对数据库进行操作,例如,定期删除读过的日志,有两种途径可以考虑:
使用MySQL的存储过程和定时器更直接
首先创建数据表
CREATE TABLE `test`.`log` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`msg` VARCHAR(255) NULL,
`isread` TINYINT(3) NOT NULL DEFAULT 0 COMMENT '0 未读 1 已读',
PRIMARY KEY (`id`));
insert些数据[此处自带循环执行特效]
insert into log values(null,'',1);
创建存储过程
DROP procedure IF EXISTS `cleardata`;
DELIMITER $$
CREATE PROCEDURE `cleardata` (IN $tname varchar(50), IN $fieldname varchar(50), IN $wheresql varchar(255))
BEGIN
set @sqlcmd = concat("DELETE FROM ", $tname, " WHERE ", $fieldname, $wheresql, " limit 1");
prepare stmt from @sqlcmd;
execute stmt;
DEALLOCATE PREPARE STMT;
END
$$
DELIMITER ;
调用下看是否能成功执行
mysql> call test.cleardata('log', 'isread', '=1');
基于此,创建一个事件:
set global event_scheduler=1;
create event if not exists event_log on schedule
every 3 second
on completion preserve
do call test.cleardata('log', 'isread', '=1')
每三秒钟执行一次删除操作
如果要停止事件
alter event event_log on completion preserve disable;
event 就是JOB,即事件调度,表示定期执行某个操作。事件一旦创建就会立即执行。
对于更精确的需求,单纯依靠php脚本不能保精确定时执行,效率也不够好。其实存储过程主要用于队列服务。在用MySQL模拟队列时就会用到存储过程、定时器等工具。而这在sns、微博等应用中很常见,也是最简单的方式。
缺点就是不如Oracle强大。但是免费啊,所以也算强大了。
使用php常驻内存或定期执行的方法实现[不是此文重点]
- PHP在cli模式下是不限时的 可以用来做计划任务
- 网页请求的话需要修改最大执行时间,就能无限执行下去;
ignore_user_abort(true) 保证用户关闭网页后程序还可以在后台执行
ignore_user_abort(true);
set_time_limit(0);
//code
- UNIX系统使用crontab实现
TIP
对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理。
http://www.jb51.net/article/38319.htm MySQL创建事件