概述
MySQL允许通过触发器、存储过程、函数的形式来存储代码。从5.1开始,还可以在定时任务中存放代码,这个定时任务也称为事件。存储过程和存储函数都被统称为存储程序。这四种存储代码都使用特殊的SQL语句扩展,它包含了很多过程处理语法,例如循环和条件分支等。不同类型的存储代码的主要区别在于其执行的上下文——也就是其输入和输出。存储过程和存储函数都可以接收参数然后返回值,但是触发器和事件却不行。
存储代码有如下优点:
- 它在服务器内部执行,离数据最近,另外在服务器上执行还可以节省带宽和网络延迟;
- 这是一种代码重用,可以方便的统一业务规则,保证某些行为总是一致,所以也可以提供一定的安全性;
- 他可以简化代码的维护和版本更新;
- 它可以帮助提升安全,比如提供更细粒度的权限控制;
- 服务器端可以缓存存储过程的执行计划,这对于需要反复调用的过程,会大大降低消耗;
- 因为是在服务端部署的,所以备份、维护都可以在服务端完成,所以存储程序的维护工作会很简单,它没什么外部依赖;
- 他可以在应用开发和数据库开发人员之间更好的分工。
存储代码也有如下缺点:
- MySQL本身没有提供好用的开发和调试工具,所以编写MySQL的存储代码比其他的数据库要更难些;
- 较之应用程序的代码,存储代码效率要稍微差些;
- 存储代码可能会给应用程序代码的部署带来额外的复杂性,原本只需要部署应用代码和库表结构变更,现在还需要额外的部署MySQL内部的存储代码;
- 因为存储程序都部署在服务器内,所以可能有安全隐患,如果将非标准的加密功能放在存储程序中,那么若数据库被攻破,数据也就泄露了;
- 存储过程会给数据库服务器增加额外的压力,而数据库服务器的扩展性相比应用服务器要差很多;
- MySQL并没有什么选项可以控制存储程序的资源消耗,所以在存储过程中的一个小错误,可能直接把服务器拖死;
- 存储代码在MySQL中的实现也有很多限制——执行计划缓存是连接级别的,游标的物化和临时表相同,异常处理也非常困难;
- 调试MySQL的存储过程是一件很困难的事情;
- 他和基于语句的二进制日志复制合作的并不好,在基于语句的复制中,使用存储代码通常有很多的陷阱。