MySQL内部存储代码有四种:触发器,存储过程,函数,事件。
优点:
l 在服务器内部执行,离数据最近,另外在服务器上执行还可以节省带宽和网络延迟。
l 一种代码重用。可以方便地统一业务规则,保证某些行为总是一致,所以也可以为应用提供一定的安全性。
l 可以简化代码的维护和版本更新。
l 可以帮助提升安全,比如提供更细粒度的权限控制。一个常见的例子是银行用于转移资金的存储过程:这个存储过程可以在一个事务中完成资金转移和记录用于审计的日志。应用程序也可以通过存储过程的接口访问那些没有权限的表。
l 服务器端可以缓存存储过程的执行计划,这对于需要反复调用的过程,会打打降低消耗。
l 因为是在服务器端部署的,所以备份、维护都可以在服务器端完成。所以存储程序的维护工作会很简单,没什么外部依赖。
l 可以在应用开发和数据库开发人员之间更好的分工。
缺点
l MySQL本身没有提供好用的开发和调试工具,所以编写MySQL的存储代码比其他的数据库要更难些。
l 较之应用程序的代码,存储代码效率要稍微差些。存储代码中可以使用的函数非常有限,所以使用存储代码很难编写复杂的字符串维护功能,也很难实现太复杂的逻辑。
l 存储代码可能会给应用程序代码的部署带来额外的复杂性。
l 因为存储程序都部署在服务器内,所以可能有安全隐患。
l 存储过程会给数据库服务器增加额外的压力,而数据库服务器的扩展性相比应用程序要差很多。
l MySQL并没有什么选项可以控制存储过程的资源消耗,所以在存储过程中的一个小错误,可能直接把服务器拖死。
l 存储代码在MySQL中的实现也有很多限制—执行计划缓存是连接级别的,游标的物化和临时表相同,异常处理也非常困难等,所以MySQL的存储代码功能还是非常弱的。
l 调试存储过程是一件很困难的事情。
l 它和基于语句的二进制复制合作的并不好。
存储过程和函数
存储程序越小,越简单越好。希望将更加复杂的处理逻辑交给上层的应用实现,这样代码更易读,易维护,也会更灵活。这样也会让你拥有更多的计算资源,潜在的还会让你拥有更多的缓存资源。
触发器
触发器可以让你在执行INSERT、UPDATE或者DELETE的时候,执行一些特定的操作。可以在MySQL中指定是在SQL语句执行前出发还是执行后触发。触发器本身没有返回值,不过它们可以读取或改变触发SQL语句所影响的数据。
对每一个表的每一个事件,最多只能定义一个触发器。
MySQL只支持“基于行的触发”,触发器始终是针对一条记录的,而不是针对整个SQL语句的,如果变更的数据集非常大,效率会很低。
事件
事件类似于Linux的定时任务。可以创建事件,指定MySQL在某个时间只需一段SQL代码,或者每隔一个时间间隔执行一段SQL代码。
如果一个定时事件执行时间很长,可能会发生前一个事件还未执行完,下一个时间点的事件又开始了。MySQL本身不会防止这种并发,所以需要用户自己编写这种情况下的防并发代码。(GET_LOCK())