MySQL 存储过程的优缺点分析

MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是数据库中存储的复杂程序,以便外部应用调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(可选)来调用执行。

Posted in MySQL onMay 20, 2021

存储过程可以有效提高 SQL 语句的复用率,并且可以将相关的一组 SQL 放入到存储过程中,从而避免了应用程序的多次查询带来的与 MySQL 服务器的连接延迟和占用的网络资源。下面是一个存储过程的示例,用于传入一个 id 来删除指定 id的学生,并同时删除扩展表中的学生信息。通过这种方式就可以处理相关联的数据,而不需要应用程序分两次 SQL 操作。

DROP PROCEDURE IF EXISTS delete_student_by_id;

delimiter $$

CREATE PROCEDURE delete_student_by_id(IN p_id INT)
BEGIN
	DELETE FROM t_students
  WHERE id = p_id;
      
  DELETE FROM t_students_info
  WHERE student_id = p_id;
END
$$
    
delimiter ;

总的来说,存储过程有如下的优点:

  • 直接在数据库层运行,从而减少网络带宽的占用和减少查询任务执行的延迟。
  • 提高了代码的复用性和可维护性,可以聚合业务规则,加强一致性并提高安全性。
  • 可以带来安全性优势以及优雅的权限控制手段。一个典型的例子就是银行中的转账存储过程。存储过程在一个事务里完成转账及记录用于后续审核的完整操作日志。可以通过存储过程完成访问而无需对涉及到的表进行提权。
  • 服务端会缓存存储过程的执行,这样可以减少重复执行的负荷。
  • 存储过程存储在服务端,因此对于服务单的部署、备份和维护而言,存储过程更好维护。
  • 可以将应用开发者与数据库开发者的工作分离,因此可以让数据库牛人来写存储过程,而避免某些应用开发者编写 SQL水平不高的问题。

当然,有利必有弊,存储过程也会存在一些缺陷:

  • MySQL没有提供好的开发和调试工具,因此存储过程的调试相对来说不那么容易。
  • SQL 语言本身的效率没有应用程序的编程语言效率高,且相对更初级。因此,难以处理复杂的业务。
  • 存储过程也可能增加应用部署的复杂度,不单单需要部署应用代码和数据库表,还需要部署存储过程。
  • 每个连接的存储过程的执行计划缓存是各自独立的。如果有很多连接调用同一个存储过程,反复地缓存会造成资源的浪费。
  • 存储过程将运行符合转移到了数据库服务器,这会导致数据库服务器的扩容更难,且比应用服务器的扩容代价更高。
  • 存储过程占用的资源难以控制,如果发生一个 bug 可能导致服务器宕机。
  • 存储过程的代码很难解读,如果单纯地调用 CALL XYZ('A')这种形式调用存储过程的话,很难分析慢查询日志。因为,这需要找到存储过程的代码并且检查里面的语句。
  • 对于语句级的 binlog或复制,使用存储过程可能会有很多陷阱导致无法使用存储过程——除非严格检查排除潜在的问题。

因此,通常,需要保持存储过程小巧简洁,以避免上述的缺陷。当然,在某些操作时,存储过程会运行得更快,尤其是在存储过程中使用循环完成多个小查询。如果查询足够小,解析 SQL 语句和网络通信则变成了工作负荷过高的重要因素。这个时候存储过程的优势就会被突显出来。以下面的存储过程代码为例:

DROP PROCEDURE IF EXISTS insert_many_rows;

delemiter //

CREATE PROCEDURE insert_many_rows(IN loops INT)
BEGIN
	DECLARE v1 INT;
  SET v1=loops;
  WHILE v1 > 0 DO
  	INSERT INTO test_table values(NULL, 0,
                                 'aaaaaaaaaaaabbbbbbbbbb',
                                 'aaaaaaaaaaaabbbbbbbbbb');
    SET v1=v1-1;
  END WHILE;
END
//

delemiter ;

可以通过与应用程序实现同样的功能进行比较,发现使用存储过程的性能提高了2倍以上,而如果与使用 MySQL 代理相比,性能会提高到3倍。

结语:存储过程目前用得其实不多,但是对于一些稳定的业务,如果是因为与数据库服务器之间的网络请求过多或占用了大量的网络带宽,则可以考虑使用存储过程来优化性能,提高响应速度。但是,存储过程务必反复验证,避免出现意向不到的错误导致耗费过多的时间排查问题。

以上就是MySQL 存储过程的优缺点分析的详细内容,更多关于MySQL 存储过程的优缺点的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
Mysql开启外网访问
May 15 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 MySQL
mysql数据库如何转移到oracle
Dec 24 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
MySQL 视图(View)原理解析
超详细教你怎么升级Mysql的版本
详解mysql三值逻辑与NULL
MySQL时间盲注的五种延时方法实现
分析MySQL抛出异常的几种常见解决方式
You might like
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
js GridView 实现自动计算操作代码
2009/03/25 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
Python爬取国外天气预报网站的方法
2015/07/10 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
Python中的枚举类型示例介绍
2019/01/09 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
历史学专业求职信
2014/06/19 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
《我是什么》教学反思
2016/02/16 职场文书