【问题标题】:What are the benefits of creating Stored Procedures in SQL and MySQL?在 SQL 和 MySQL 中创建存储过程有什么好处?
【发布时间】:2013-06-22 20:55:50
【问题描述】:

我有一个理论问题。

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

我为什么要创建一个存储过程,例如,当我可以使用 PHP 函数返回一个特定国家/地区的所有城市列表时em> 查询数据库,结果是否相同?

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

谢谢。

【问题讨论】:

    标签: php mysql stored-procedures


    【解决方案1】:

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

    使用存储过程:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        一些好处包括:

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

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

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

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

        (在您的特定示例中,好处是肯定为零。)

        【讨论】:

        • 存储过程的一个巨大缺点是它们存在于数据库中,而不是在 GIT 等版本控制系统中,因此我不喜欢非静态开发环境中的存储过程。如果你确定你的职能在未来 10 年内不需要改变……(但我不会为这样的公司工作)
        • @user613326:将 SP 放入 git 并没有错。如果有的话,他们绝对应该在那里。
        • @user613326 现在大多数框架都支持迁移。没有理由不能在迁移中定义存储过程,这很容易解决这个问题。
        【解决方案4】:

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

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

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

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

          常规:
          查询创建 @Client ---------- 然后传播到服务器 ----------Query : Reached server : Parse, Compiled , execute。

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

          优点:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-11-12
          • 1970-01-01
          • 2021-09-25
          • 2019-03-05
          • 1970-01-01
          • 1970-01-01
          • 2016-11-11
          • 2017-10-14
          • 2021-07-10
          相关资源
          最近更新 更多