22

我有一个理论问题。

我看不出在 PHP 文件中声明函数和在执行相同操作的数据库中创建存储过程之间有任何区别。

为什么我要创建一个存储过程,例如,返回一个特定国家/地区的所有城市的列表,而我可以使用 PHP函数来查询数据库并且它会得到相同的结果?

在这种情况下使用存储过程有什么好处?或者哪个更好?使用 PHP 中的函数或数据库中的存储过程?两者之间有什么区别?

谢谢你。

4

4 回答 4

29

一些好处包括:

  • 可维护性:您可以更改程序中的逻辑,而无需编辑 app1、app2 和 app3 调用。

  • 安全/访问控制:担心谁可以调用预定义的过程比控制谁可以访问哪些表或哪些表行更容易。

  • 性能:如果您的应用程序与数据库不在同一台服务器上,并且您正在执行的操作涉及多个查询,则使用过程通过涉及对数据库的单个调用而不是尽可能多的调用来减少网络开销查询。

  • 性能(2):过程的查询计划通常被缓存,允许您一次又一次地重用它,而无需重新准备它。

(在您的特定示例中,收益无疑是零。)

于 2013-06-25T21:35:34.570 回答
6

简短的回答是,如果您希望代码可移植,请不要使用存储过程,因为如果您希望在某个时候将数据库从 MySQL 更改为 PostgreSQL,则必须更新/移植您编写的所有存储过程。

另一方面,有时您可以使用存储过程获得更好的性能结果,因为所有代码都将由数据库引擎运行。如果存储过程使用不当,也会使情况变得更糟。

我不认为选择国家是非常昂贵的操作。所以我想你不必在这种情况下使用存储过程。

于 2013-06-25T21:35:22.537 回答
4

正如大多数人已经解释过的那样,但我仍然会尝试以我自己的方式重申

存储过程:
逻辑驻留在数据库中。
让我们说一些我们需要执行的查询,然后我们可以通过以下方式做到这一点:

  • 将查询从客户端发送到数据库服务器,在那里它将被解析、编译然后执行。
  • 另一种方法是将查询驻留在数据库服务器并为查询创建别名,客户端将使用该别名将请求发送到数据库服务器,并在服务器收到时执行。

    所以我们有:
    客户------------------------------------------ -------------> 服务器

    常规:
    查询创建 @Client ---------- 然后传播到服务器 ----------查询:到达服务器:解析、编译、执行。

    存储过程:
    已创建别名,由客户端使用----然后传播到服务器-------- 别名到达服务器:解析、编译、缓存(对于第一次)
    下次出现相同的别名时,直接执行查询可执行文件。

    优点 :

  • 减少网络流量:如果客户端正在发送一个大查询,并且可能非常频繁地使用相同的查询,那么查询的每一位都会发送到网络,因此可能会增加网络流量并不必要地增加网络使用率。

  • 更快的查询执行:由于存储过程是一次性解析、编译的,并且可执行文件缓存在数据库中。因此,如果多次重复相同的查询,则数据库直接执行可执行文件,因此在 Parse、Compile 等中节省了时间。如果经常使用查询,这很好。如果不经常使用查询,那么它可能不好,因为存储缓存的可执行文件需要空间,为什么不必要地将负载放在数据库上。

  • 模块化:如果多个应用程序想要使用相同的查询,那么使用传统方式您在应用程序中不必要地重复代码,最好的方法是将代码放在靠近数据库的地方,这样可以轻松缓解重复。

  • 安全性:还开发了存储过程,请记住授权(意味着谁有权运行查询而谁没有)。因此,对于特定用户,您可以授予权限,而您作为 DBA 可以撤销权限。因此,对于 DBA 来说,这是一个很好的方法,一个 DBA 你可以知道谁是获得访问权限的合适人选。但是现在这样的事情并不那么流行,你可以设计你的应用程序数据库,这样只有授权的人才能访问它,而不是全部。因此,如果您仅将安全/授权作为使用存储过程而不是传统的做事方式的点,那么存储过程可能不合适。

于 2015-05-25T11:33:49.397 回答
3

好的,这可能有点过于简单(并且可能不完整):

使用存储过程:

  1. 您不需要将查询传输到数据库
  2. DBMS 不需要每次都验证查询(在语法意义上验证等)
  3. DBMS 不需要每次都优化查询(请记住,SQL 是声明性的,因此,DBMS 必须生成优化的查询执行计划)
于 2013-06-25T21:34:27.297 回答