vlambda博客
学习文章列表

阿里为什么禁止MySQL使用存储过程

0x00 前言

之前从数据交流群里看到了一份阿里的Java开发手册,其中关于MySQL的部分,有一条是禁止使用存储过程。当时我真的是蒙圈了:我们bi库里的数据的etl都是通过存储过程来实现的,这个手册里竟然不让用……所以,去度娘了一下,今天归纳一下,自己搜集到的可能的原因。

0x01 减少数据库的压力

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

0x02 将业务逻辑的实现完全置于java代码中,集中在一起易于维护和调试

我这里举个例真实例子,那时我还在阿里当DBA,某日下午帐务团队发版,要更新一个帐务库里面某个存过,存过的sql写得有问题,更新后,卧槽,load瞬间就起来了,马上找到上一版存过代码覆盖回去,卧槽,更新失败,因为一堆会话都在执行这个存过,杀会话,不行,新的请求进来,触发新建会话,杀不完,关监听杀会话,帐务就不能连db,赶紧回滚存过,开监听,请求浪涌般进来,又是一轮load飙升,幸好db顶住了,不至于全库故障,后续就是一堆差错处理的数据订正,再后来帐务团队主动把这个存过下掉,改用java实现其逻辑,从此再无业务存过在数据库中了。
https://www.zhihu.com/question/57545650/answer/282411475


对于互联网企业,主要是scalibility的问题,这一个问题就一票否决了,当然也存在调优和部署的问题。

对于传统IT项目,主要是调试,维护以及部署的问题。从我认识的dba来看,他们大多数是支持存储过程的,他们觉得他们能搞定。所以你要是问他们,什么scale,什么调试,什么部署,都不是问题。那么作为一个后端或者java程序员,你要问我,我肯定说禁止使用存储过程。

虽然说功能当然都能实现,但做得出和做的好是两码事。

1,从软件设计的角度来说,业务逻辑的实现要集中在一起,这才是好管理的,好维护的,出了问题你才能容易找得到。这样的软件系统也是好设计的,好测试的。如果你不能把一切都写在存储过程里,那你还是都写在应用层里吧。而我是不觉得绝大多数应用可以把所有业务逻辑都写成存储过程。就算可以,也代价太大,你说是java好写还是存储过程好写?有朋友说我就写个简单易维护的小存储过程怎么了,但简单的东西也要维护,它也有可能有一天变得复杂,你的项目可能有一天就有了上千个这样的东西。防微杜渐的道理正在于此。

2,从项目管理的角度来讲,你找个java程序员容易还是找个dba容易?好的DBA各个都拽的跟二五八万似的,一般程序员的工资人家是看不上眼的,恨不得java架构师都听他的。现实是你根本就没法组个DBA大型团队,太难太难了。(这里不是说DBA性格不好啥的,主要是市场稀缺,过于抢手,造成你招不到DBA)

3,从scale的角度来说,是应用层好scale还是关系型数据库好scale上去?当然都能scale, 不过应用层要容易好多,一般来说你多加服务器就好了。

4,从系统瓶颈的角度来讲,十个系统有九个瓶颈在数据库,你还往数据库上加码,多数高并发的互联网服务,我打赌如果你大搞存储过程,DBA自己都得跳楼。

5,从主流价值观的角度来讲,现在还是后端程序员当家做主的时代,在公司往往有更大的话语权,要是你非要写个存储过程和主流后端观点拧着干,你的上司十有八九要批你。我觉得存储过程其实更适用于offline的服务和数据库,让你没事跑跑数据,聚合一下。前面有人说olap的,也是合理的。但这篇手册是java开发手册,不是dba或者数据工程师手册,我个人觉得对java程序员禁止使用存储过程是合理的。

0x03 业务场景决定不用的优越性>用

这种一刀切的回答当然必须得考量上下文:一来MySQL的存储过程跟PostgreSQL, Oracle, MSSQL一比就是个笑话。二来存储过程对于糙猛快变化多的典型互联网场景比较鸡肋。维护性与难调试的问题说到底是开发人员的知识与水平不足,如果你自己清楚知道怎么用和为什么要用存储过程,那为什么不用?尽信书不如无书啊。对于一些领域模型相当稳定的场景,存储过程其实是非常好的一个选择。很多时候用存储过程一次就能解决原来业务要几次RT访问才能搞定的事情,聚合Join处理一些常用的结果。另外数仓里搞OLAP写的UDF说到底不也是存储过程嘛。很多场景下合理利用数据库的编程能力可以极大的提高开发效率与运行效率。
https://www.zhihu.com/question/57545650/answer/153492006 ​

这个场景是对于Java开发的程序员约束的,为我们部门是从数据仓库里抽取数据,生成结果表展示到DM后台的场景,使用存储过程能够更加的迅速快捷。