存储过程:SQL 语句集合。

好处:

  1. 在创建时进行编译,执行不再重新编译;一般 SQL 执行一次编译一次。
  2. 将此复杂操作用存储过程封装起来。
  3. 存储过程可以重复使用。

坏处:

  1. 不易调试。
  2. 可移植性差。

示例

1
2
3
4
5
6
7
DROP PROCEDURE IF EXISTS delete_data;
DELIMITER $$
CREATE PROCEDURE delete_data(IN idX INTEGER)
BEGIN
DELETE FROM `source` WHERE id = idX;
END$$
DELIMITER ;

其他说法一

存储过程没有版本控制,版本迭代的时候要更新很麻烦。
存储过程如果和外部程序结合起来用,更新的时候很难无感升级,可能需要停服。
存储过程不利于将来分库分表。
存储过程的功能不一定够强大,业务扩展之后可能会发现无法继续用存储过程实现了。
存储过程可能无法和许多中间件、ORM 库一起使用。
某些特殊的兼容 MySQL 的实现可能根本就不支持存储过程,那就更不用说了。
这也不绝对,在微软的时候就有项目是反过来的,所有业务都需要用存储过程写在 SQLServer 里面,查询全写成视图,业务代码只允许使用视图和存储过程,只要 SELECT 和 EXECUTE 权限就够了;修改业务只需要登服务器改存储过程。这属于思路不同。

其他说法二

任何技术都要分使用场景,阿里这种互联网高并发的场景,很多数据都是分库分表的,而且要求高度可扩展,原则是对 db 的保护做到最大化,能减少 db 压力的就减少 db 压力,尽量把运算逻辑拉到代码里面。存储过程的优点在于封装性好,直接让 db 进行运算,但是缺点在于难以维护,而且大大增大 db 压力。所以开发过程中禁止使用存储过程也是阿里多年经验积累出来的。

存储过程几个优点

存储过程消除不必要的网络 IO,所有事务型请求时延控制在 1ms 内,极大地提高了系统性能。
存储过程在在数据库和后端应用之间提供了一个额外的接口层,当底层数据库发生模式变更时,可以对上层应用保持透明;提供了巨大的灵活性,并降低了系统复杂性。