MySQL存储过程和事件调度

  1. SQL首先是一门编程语言,其次才是查询语言,利用SQL语言可完成复杂的数据库业务操作,这往往通过编写存储过程来实现。MySQL5支持存储过程、函数、视图、JOB等。WEB应用中经常会要求某个任务常驻内在或定期执行,PHP脚本在CLI模式下或设置了ignore_user_abort(true)后可无限时执行,或者在UNIX系统下可用Crontab命令去定时触发。如果只涉及单纯的数据库操作,MySQL5的event就可定时触发,这样直接在MySQL数据库能完成的操作就无而在编程语言中写代码。
  2. 示例:如现有日志存储表结构如下:CREATE TABLE 'log' ('id' INT(10) NOT NULL AUTO_INCREMENT,'msg' VARCHAR(200) NULL DEFAULT '0','isread' INT(11) NULL DEFAULT '0',PRIMARY KEY ('id')) COLLATE='utf8_general_ci',现需要定期删除看过的日志文件,其存储过程如下:
    CREATE PROCEDURE delete_log(IN columnField VARCHAR(10))
    NOT DETERMINISTIC
    DELETE FROM log WHERE columnField = 1
    存储过程支持IF..ELSE、循环等语法,创建一个存储过程需要固定的格式和套路,通常分以下几步:
1)确定输入、输出参数和类型,如上 IN \`tableName\` VARCHAR(20)
2)定义变量和赋值:declare var float; set var = 0; set var = rand();如set的变量前有@符号表示这是一个会话变量否则只是一个局部变量
3)过程的主体部分:可以是各种去处也可以是数据库操作
4)程序的返回值,可以有也可以没有,比如有返回值的简单例子:

我们定义的存储过程调用如下:CALL delete_log('isread'),基于此,创建一个事件,CREATE EVENT IF NOT EXISTS event_log ON SCHEDULE EVERY 100 SECOND ONCOMPLITION PRESEVER DO CALL delete_log("isread"),EVENT就是我们常说的JOB,即调试,表示定期执行某个操作,上面event_log的含义是每100秒执行一次,调用utable存储过程。事件一量创建就会自动执行.关闭EVENT语句:ALTER EVENT event_log COMPLETION PRESERVE DISABLE;

  1. PHP脚本也能定时触发且简单,但是对于更精确的需求,仅PHP脚本不能保证精确定时执行,效率也不够好。其实存储过程主要用于队列服务,而MySQL模拟队列时就需要用到存储过程、定时器等工具,而这在SNS、微博等应用中很常见也是最简单的方式。如果创建的EVENT执行不了则用SHOW VARIABLES LIKE '%sche%';来查看和SET GLOBAL event_scheduler=1;来开启。在实际业务中,存储过程得到了大量的应用,特别是Oracle这类的商业数据库很多业务逻辑都由存储过程完成 ,因此存储过程能提升效率且具有模块化、易于利用、可以移植等特点。虽然MySQL的存储过程存在有不像ORACLE那样有强大且成熟的高度高度工具且编程能力远弱于ORACLE等商业数据库,但作为一个开源免费的数据库产品它提供的功能已经足够强大了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值