一尘不染

MySQL存储过程使用还是不使用它们

mysql

我们正处于一个新项目的开始,我们真的想知道是否应该在MySQL中使用存储过程。

我们将仅使用存储过程来插入和更新业务模型实体。有几个表代表一个模型实体,我们将在那些存储过程的插入/更新中对其进行抽象。

另一方面,我们可以从Model层调用插入和更新,但是不能在MySQL中,而是在PHP中。

根据您的经验, 哪个是最佳选择? 两种方法的优点和缺点。就高性能而言,哪个是最快的?

PS:这是一个大多数阅读的Web项目,而高性能是最重要的要求。


阅读 362

收藏
2020-05-17

共1个答案

一尘不染

与实际的编程语言代码不同,它们:

  • 不可移植(每个数据库都有其自己的PL / SQL版本。有时 同一 数据库的不同版本不兼容-我已经看到了!)
  • 难以测试-您需要一个 真实的 (dev)数据库实例对其进行测试,因此几乎不可能对它们的代码进行构建的单元测试
  • 不容易更新/发布-您必须删除/创建它们,即 修改 生产数据库以释放它们
  • 没有库支持(为什么在别人拥有时编写代码)
  • 不容易与其他技术集成(尝试从中调用Web服务)
  • 他们使用的语言与Fortran一样原始,因此难以完成有用的编码,因此很难表达业务逻辑,即使通常这是其主要目的。
  • 不提供调试/跟踪/消息记录等功能(某些数据库可能支持此功能-虽然我没有看到)
  • 缺乏像样的IDE来帮助语法和链接到其他现有过程(例如,像Eclipse的Java那样)
  • 熟练的编码人员比应用编码人员稀有且昂贵
  • 它们的“高性能”是一个神话,因为它们通常在数据库服务器上执行,因此通常会 增加 数据库服务器的负载,因此使用它们通常会 降低 最大事务吞吐量
  • 无法有效共享常量(通常通过在过程中创建表并对其进行查询来解决-非常低效)
  • 等等

如果您有一个非常特定于数据库的操作(例如,用于维护数据库完整性的事务内操作),或者使您的过程保持原子性和简单性,那么也许您可以考虑使用它们。

在预先指定“高性能”时,建议谨慎。它通常会导致错误的选择,以牺牲好的设计为代价,并且比您想的要早得多。

使用存储过程的后果自负(曾经去过那里并且从不想回头的人)。我的建议是避免它们像瘟疫一样。

2020-05-17