我有一个理论问题。
我认为在PHP文件中声明函数和在执行相同操作的数据库中创建存储过程之间没有任何区别。
为什么我要创建存储过程,例如,返回特定国家/地区的所有城市列表,当我可以使用PHP 函数查询数据库,它会有相同的结果吗?
在这种情况下,使用存储过程有什么好处?或哪个更好?要在数据库中使用PHP或存储过程中的函数?这两者有什么不同?
谢谢。
答案 0 :(得分:28)
一些好处包括:
可维护性:您可以更改过程中的逻辑,而无需编辑app1,app2和app3调用。
安全/访问控制:更容易担心谁可以调用预定义的过程,而不是控制谁可以访问哪些表或哪些表行。
性能:如果您的应用程序与数据库不在同一服务器上,并且您正在执行的操作涉及多个查询,则使用过程通过涉及对数据库的单个调用来减少网络开销,而不是和查询一样多的电话。
性能(2):程序的查询计划通常是缓存的,允许您一次又一次地重复使用它,而无需重新准备它。
(就你的具体例子而言,这些好处无可争议。)
答案 1 :(得分:6)
简短的回答是,如果你想要代码是可移植的,不要使用存储过程,因为如果你想在某些时候将数据库从MySQL更改为PostgreSQL,你必须更新/移植你编写的所有存储过程
另一方面,有时您可以使用存储过程获得更好的性能结果,因为所有代码都将由数据库引擎运行。如果存储过程使用不当,您也会使情况变得更糟。
我不认为选择国家是非常昂贵的操作。所以我猜你不必为这种情况使用存储过程。
答案 2 :(得分:3)
使用存储过程:
答案 3 :(得分:3)
正如大多数人已经解释过的那样,但我仍然会以自己的方式重申
存储过程:
逻辑驻留在数据库中
让我们说一些我们需要执行的查询,然后我们可以通过以下方式来执行:
另一种方法是将查询驻留在DataBase服务器上并为查询创建别名,客户端将使用该别名将请求发送到数据库服务器,并在收到服务器时将执行。
所以我们有:
客户------------------------------------------------- --------->服务器
常规:
查询创建@Client ----------然后传播到服务器----------查询:已到达服务器:解析,编译,执行。
存储过程:
别名被创建,由客户端使用----------------然后传播到服务器--------在服务器上达到的别名:解析,编译,缓存(第一次)
下次出现相同的别名时,直接执行查询可执行文件。
优势:
减少网络流量:如果客户端发送大量查询,并且可能经常使用相同的查询,则查询的每一位都会发送到网络,因此可能会增加网络流量和不必要的网络使用量增加。
更快的查询执行:由于存储过程被解析,一次编译,并且可执行文件缓存在数据库中。因此,如果相同的查询 重复多次,然后数据库直接执行可执行文件,因此时间保存在Parse,Compile等中。如果频繁使用查询,这很好。 如果不经常使用查询,那么它可能不太好,因为存储缓存的可执行文件会占用空间,为什么不必要地加载数据库。
模块化:如果多个应用程序想要使用相同的查询,那么使用传统方式在应用程序中不必要地复制代码,最好 方法是将代码放在数据库附近,这样可以很容易地减轻重复。
安全性:还开发了存储过程,请记住授权(意味着谁有权运行查询,谁不是)。因此,对于特定用户,您可以授予权限对于其他人,您作为DBA可以撤销该权限。因此,作为DBA DBA的一个好方法,您可以知道哪些人是正确的人来获取访问权限。但是这些事情现在不那么受欢迎,您可以设计您的应用程序数据库,以便只有经过授权的人才能访问它而不是所有。 因此,如果您只使用安全/授权作为使用存储过程而不是传统的处理方式,那么存储过程可能不合适。