辛星解读mysql中的存储过程的优劣

我们常用的SQL语句在执行的时候需要首先进行编译,然后执行,而存储过程则是一组为了完成特定功能的SQL语句集,它直接编译好了存储在数据库中,用户通过指定存储过程的名字即可调用该存储过程。

存储过程的优点主要包括以下几点:

第一点,性能提高。这是相对于不适用存储过程来说的,因为存储过程在创建的时候就编译好了,而后每次调用都不会再次编译,这相对于传统的SQL语句中每次调用都需要编译的情况来说,性能提高了何止一点两点。

第二点,重用性强。存储过程使用名字即可使用,也就是传说中的“一次编写,随便调用”。这样不仅提高了重用性,还减少了出错的几率,也会加快开发速度,可以说是一件非常好的事情。

第三点,减少网络流量。这一点对于小数据量的时候一般体现不出来,那么当数据量较大的时候,我们会发现由于使用存储过程比使用SQL语句会使用更少的字节数,因此它会降低传输的数据量。

第四点,安全性提高。由于存储过程也可以使用权限控制,而且参数化的存储过程可以防止SQL注入攻击,也在一定程度上保证了安全性。

第五点,灵活性增强。由于存储过程可以使用流程控制语句来编写,导致它有着很强的灵活性,可以根据实际情况来执行不同的SQL语句,而不是只能单纯的简单的执行命令。而且该存储过程还可以修改其逻辑而其他部分不用改变,也就是说,我们的表的结构改变了,我们只需要修改相应的存储过程即可,我们的Java或者PHP等程序不需要改变。

第六点,当业务复杂的时候,存储过程会减少工作量,为什么呢,原因很简单,如果我们不适用存储过程,那么就会导致我们先从数据库中取出来数据,然后经过计算,再放入到数据库中,这个开销还是蛮大的,这中间的开销包括我们的Java或者PHP程序连接数据库获取结果集等若干操作,如果我们使用了存储过程,那么就没有那么多事了,直接在mysql内就搞定了。

好,上面说完了存储过程的优点,当然存储过程也肯定有它的缺点,下面是它的几个缺点:

第一点,工作量加大。这里并不是说我们把程序该做的事让mysql去做不好,而是mysql本身并没有很像样的IDE来开发我们的存储过程,我们很多时候还是需要手写,这样就会比较麻烦,而且存储过程的调试也是一个问题,没有很像样的调试工具。

第二点,优势不明显。运行速度上,对于大多数的语句缓存来说,编译sql的时间开销并不是很大,但是执行存储过程还需要检查权限等一些其他开销,所以,对于很简单的sql,存储过程并没有很大优势。

第三点,赘余功能。对web程序来说,我们连接数据库的用户往往就是同一个,不需要太多的安全机制,所以,对于安全上的检测看上去很好,实际上优点多余。

第四点,小型程序完全无用。对于小型web应用来说,它的使用价值就更小了,反而会拖累开发进度。

第五点,对于运维上。当我们的程序要更换数据库的时候,它的移植性相对于不适用存储过程要复杂一些,对于维护上,由于是在db端,因此比server端的程序更好维护一些。

时间: 2024-10-11 16:33:55

辛星解读mysql中的存储过程的优劣的相关文章

辛星解读mysql中的MyISAM引擎

很多以前的教科书上都是写的MyISAM是mysql的默认存储引擎,其实自从mysql5.5开始,默认存储引擎就已经改变成为InnoDB了,由于InnoDB在很多方面有着不可替代的功能,因此,很多人喜欢研究InnoDB也在情理之中,我也很喜欢InnoDB.但是呢,对于MyISAM,就跟着辛星辛博士来认识一下吧. 第一点就是MyISAM不支持事务和外键,也正是基于这一点,很多人不喜欢MyISAM.但是MyISAM并不着急改变自己,因为这个引擎的重心是性能,而不是功能,不可否认,MyISAM的性能是非

辛星解读mysql的用户管理

可能做开发的多半不太关注这方面,但是要说到做运维,那就不能不关注了.因为我们都知道,root的权限太大了,不是随便能用的,我们平时最好用一些比较低的权限的用户,这样会让我们的安全性大大提高,也能防止我们平常中因为误操作而造成不必要的损失. 首先我们需要查看mysql中的所有账户,我们在mysql数据库中的user表中查看信息即可,但是呢,由于我们直接select * from user的话会显示很多的和权限相关的信息,极大的影响我们的阅读,因此我们这里只查看三个比较重要的字段,下面是我的机器中的

跟着辛星解读PHP中json的使用

由于json是那么的重要,因此PHP自从5.2就增加了对JSON的支持,主要包括两个函数:json_encode和json_decode.众所周知,json是一种数据的存储格式,我的博文里写过json的,在我的Javascript教程中,不明白的读者可以去搜一下. 比如我们新建一个xin.json文件,存储数据如下: [{"name":"辛星","age":23},{"name":"小倩","ag

辛星浅析MySQL中的last_insert_id()

很多时候,我们在插入一条数据的时候,我们需要知道它的主键是多少,它会自动返回最后一个insert并且为auto_increment列位置的第一个发生的值. 而且需要注意的是产生的id每次连接后保存在服务器中,这意味着函数向一个给定客户端返回的值就是该客户端产生对影响auto_increment列的最新语句后的第一个auto_increment值. 而且这个值不会被其他客户端影响,即使它们产生了它们自己的auto_increment值,这个行为是保证了我们能够找回自己的id而不用担心其他客户端的活

辛星解读之php中的重点函数第一节之数组函数

这里我已经写好它的pdf版本了,比本博客更加适合阅读.首先说一下它在百度网盘的下载地址把:百度网盘下载 ,如果左边连接跪了,可以在浏览器中输入:http://pan.baidu.com/s/1qW5AYzM 来下载.然后说一下它在csdn的下载地址,是免积分的奥,下载地址:csdn资源下载处 ,如果连接不起作用,可以在浏览器输入:http://download.csdn.net/detail/xinguimeng/7697309  来手动下载. 好,我们知道php中函数还是很多的,正是这些函数为

辛星让mysql跑的更快第一节之优化的方向和数据库建模

最近计划写一套书目,也就是关于mysql的优化的,那么首先在博客上写写,然后整理成pdf的文档的形式,当然也期待各位的关注了.对于mysql的优化是一个比较大的话题,可优化的地方也很多,大致想了一下,可以从这些地方下手. 首先就是硬件层次,包括选择合适的操作系统.选择合适的硬件,然后就是源码层次,不过虽然mysql是开源的,但是能够修改其源代码的公司虽然不少,但是也没有那么多,但是我们可以选择更加合适的编译器重新编译其源代码,然后就是设计到表的设计,也就数据库建模. 其次可以考虑使用一些其他技术

2014年辛星解读Javascript之DOM快速入门

在Javascript的知识中,有一个所谓的DOM,即文档对象模型,我们可以通过它来访问HTML文档的元素,当网页被加载的时候,浏览器会去创建DOM,有了这个DOM,我们可以使用Javascript去改变页面中HTML元素和属性,改变CSS样式,能够对页面中的事件作出响应. 首先就是查找一个HTML元素,我们可以通过三种方式来做到,即通过id.标签名和类名,通过id是使用getElementById方法,它是doucument的一个方法,通过标签名则可以使用getElementsByTagNam

2014年辛星解读Javascript之用DOM动态操纵HTML元素

关于DOM,我们了解了可以用DOM操纵HTML的一些属性和样式,还可以为HTML元素绑定事件等等,那么接下来,我们将涉及到用DOM来动态的创建.删除HTML等一些操作,我的核心思路还是重实战,因此,代码示例是肯定少不了的. 不过在使用DOM动态操纵HTML元素之前,我们还是先了解一下DOM树,下面是我从网上找的一个DOM树的图片,它的截图如下: 如果大家学习过"树"这种数据结构,就会很好理解,一个父节点可以包含N个子节点,这些子节点可能是div.p等标签,也可以是属性,还可以是中间的文

2014年辛星解读CSS第八节 使用背景图片

这应该是系统CSS的教程的最后一节了,为什么呢,因为到这一节,我感觉基础知识就已经讲完了,接下来的就是无穷的实战,而实战是很难用知识去讲出来的,靠的是积累,拼的是经验,这些都不是讲出来的. 好,我们下面来说一下用CSS添加背景图片的方式把,它在background属性中指定,可以用url("图片路径")的方式来指定背景图片,如果是repeat,则图片在横向和纵向上平铺,如果是no-repeat,则背景图像不会平铺,只显示一次,如果是repeat-x,那么就在水平方向平铺,如果是repe