【发布时间】:2010-09-10 03:37:25
【问题描述】:
我引用了我收到的another question of mine 的部分答案:
在 PHP/MySQL 世界中,我会说 存储过程是不行的
我想知道:是这样吗?为什么?为什么不呢?
[edit]我的意思是这是一个一般性问题,没有考虑到特定需求[/edit]
【问题讨论】:
-
如果您提供问题的链接以获取上下文,这将有所帮助。
标签: php mysql stored-procedures
我引用了我收到的another question of mine 的部分答案:
在 PHP/MySQL 世界中,我会说 存储过程是不行的
我想知道:是这样吗?为什么?为什么不呢?
[edit]我的意思是这是一个一般性问题,没有考虑到特定需求[/edit]
【问题讨论】:
标签: php mysql stored-procedures
我开发和维护一个大型 PHP/MySQL 应用程序。这是我在存储过程方面的经验。
随着时间的推移,我们的应用程序变得非常复杂。并且所有的逻辑都在 php 端,一些操作会使用 100 多个短查询来查询数据库。
MySQL 速度如此之快,性能还可以接受,但不是很好。
我们决定在最新版本的软件中将一些逻辑转移到存储过程中以进行复杂的操作。
我们确实实现了显着的性能提升,因为我们不必在 PHP 和 MySQL 之间来回发送数据。
我同意这里的其他发帖者的观点,即 PL/SQL 不是现代语言并且难以调试。
底线:存储过程在某些情况下是一个很好的工具。但除非你有充分的理由,否则我不建议使用它们。对于简单的应用程序,存储过程不值得麻烦。
【讨论】:
在 MySQL 中使用存储过程时,您通常需要在 PHP 中使用 mysqli 接口,而不是常规的 mysql 接口。
这是因为存储过程通常会返回超过 1 个结果集。如果是这样,mysql API 无法处理它,你会得到错误。
mysqli 接口具有处理这些多个结果集的函数,如mysqli_more_results 和mysqli_next_result 等函数。
请记住,如果您从存储过程返回任何结果集,那么您需要使用这些 API,因为存储过程会为实际执行生成 1 个结果集,然后为每个结果集生成 1 个额外的结果集有意从存储过程中返回。
【讨论】:
我通常远离存储过程,因为它会在 99% 的情况下增加数据库的负载,这是您最大的瓶颈。与复制 MySQL 数据库相比,添加新的 php 服务器无济于事。
【讨论】:
CONCATS 在 MySQL 服务器上运行并不意味着您一定要做更多的 data hits。数据库性能问题并不总是基于 CPU 消耗,但我相信它们与表锁定和数据刷新等有关。我真的不知道,但就像@Anders 所说,SP 可能会在一定程度上缓解这个问题,而不是让它变得更糟。
您是否有特定的需求让您考虑这些需求?存储过程的可移植性远不如“普通”SQL,这通常是人们不想使用它们的原因。此外,在编写了相当多的 PL/SQL 之后,我必须说编写代码的过程方式增加了复杂性,而且它不是很现代或可测试的。在某些需要优化的特殊情况下,它们可能会派上用场,但我肯定会三思而后行。杰夫有similar opinions。
【讨论】:
这是一个主观问题。
我个人会在 PHP 中包含所有计算,并且只真正将 MySQL 用作表。
但是,如果您觉得使用存储过程更容易,那么请继续使用。
【讨论】:
我不会说“存储过程是不行的”,我会说“不要在没有充分理由的情况下使用它们”。
MySQL 存储过程的语法特别糟糕(Oracle 和 MSSQL 也很糟糕),维护它们只会使您的应用程序复杂化。
如果您有真正(可衡量的)理由,请使用存储过程,否则不要这样做。反正这是我的看法。
【讨论】:
mysql 的存储过程可能存在恐惧症,部分原因是它的功能不是非常强大(与 Postgresql 甚至 MSSQL 相比,mysql 的存储过程非常缺乏)。
优点:它们使从一种以上的语言与它进行交互变得更容易。
如果有人说“使用存储过程不好,因为它不能移植到不同的数据库”,那么这当然意味着他们认为您可能会切换数据库,这意味着他们反过来说他们认为您不应该使用mysql。
现在很流行使用 ORM,但我个人认为 ORM 是个坏东西 (Question:82882)
【讨论】:
我认为使用存储过程可以在某些应用程序中提供一些抽象,就像在任何使用相同 SQL 代码块来更新或添加相同数据的地方一样,您可以创建一个 sproc save_user($attr.. ...)而不是到处重复自己。
同意语法很复杂,如果您习惯于 MSSQL 和 oracle sprocs,则可能存在差异。
【讨论】:
您还应该知道,Mysql 5.0 之前的版本不支持存储过程。 http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html 存储过程在该实现中往往有点奇怪。现在 Mysql 5.1 开始在野外出现,我看到存储过程更多地与 Mysql 一起使用。
【讨论】:
我对存储过程的使用有限,而且效果很好。我是我公司的一位客户的首席开发人员,在他们的电子商务网站上工作。客户有一个库存系统,我们在他们的系统上实现了一组存储过程,并构建了一个 API 来与之通信。这使我们能够抽象他们的数据库,并且他们可以在存储过程中实现逻辑。简单但很好地满足了业务需求。
【讨论】: