mysql中常用的三种存储引擎的区别(MySQL 存储过程的优缺点分析)
mysql中常用的三种存储引擎的区别
MySQL 存储过程的优缺点分析mysql 5.0 版本开始支持存储过程。存储过程(stored procedure)是数据库中存储的复杂程序,以便外部应用调用的一种数据库对象。存储过程是为了完成特定功能的sql语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(可选)来调用执行。
存储过程可以有效提高 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 存储过程的优缺点的资料请关注开心学习网其它相关文章!
原文链接:https://juejin.cn/post/6963995821637369864
- MySql开启远程连接
- 宝塔数据库不小心删了(宝塔面板MySQL数据库经常自动停止的解决方法)
- mysql统计函数详解(浅析MySQL的基数统计)
- 查看mysql索引缓存(MySQL查询缓存的小知识)
- mysql的浮点数类型(浅谈MySQL中float、double、decimal三个浮点类型的区别与总结)
- mysql 多表连接查询(MySQL多表查询的具体实例)
- phpmysql完全学习手册教程(Windows下搭建PHP开发环境Apache+PHP+MySQL)
- mysql exists的用法(Mysql exists用法小结)
- windows下mysql密码重置(Windows10系统下Mysql8.0.13忘记root密码的操作方法)
- mysqlsql语句的优化(MySQL优化之如何写出高质量sql语句)
- mysql 建表命令注释(mysql alter table命令修改表结构实例详解)
- mysql怎么看脱机数据(MYSQL电话号码,身份证数据脱敏的实现)
- mysql游标的使用(MySQL 游标的作用与使用相关)
- 终于有人将mysql 索引讲清楚了(MySQL 索引的一些细节分享)
- mysqlbinlog怎么分析(MySQL中使用binlog时格式该如何选择)
- mysql多核cpu利用(mysql CPU高负载问题排查)
- 大事件 合肥四中火了(大事件合肥四中火了)
- 翼龙贷组织出借人调研 感受鄱阳 借 来的致富路(翼龙贷组织出借人调研)
- 2023新国风戏曲教育寒假集训班汇报演出《戏娃闹元宵》图文报道(2023新国风戏曲教育寒假集训班汇报演出戏娃闹元宵图文报道)
- 九儿《狐踪谍影》出演热血女特警,戏份杀青受关注(九儿狐踪谍影出演热血女特警)
- 红色代表什么(红色代表什么寓意)
- 蓝天代表什么(蓝天代表什么生肖)
热门推荐
- docker查看某个容器状态(docker 移除掉运行不正常的container操作)
- 使用Console命令调试JS
- Asp.net中params的使用
- python 循环遍历新方法(python for 循环获取index索引的方法)
- python 调钉钉接口(python3实现钉钉消息推送的方法示例)
- 解忧大队es6扩展运算符(ES6扩展运算符的使用方法示例)
- cookie和session流程(浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同)
- python socket 设置通信协议(详解python中TCP协议中的粘包问题)
- 如何查看mysql执行计划(到底什么是Mysql执行计划?)
- mysql8修改默认端口(MySQL 8.0新特性 — 管理端口的使用简介)