当前位置: 首页 > 面试题库 >

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

巩子实
2023-03-14
问题内容

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

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

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

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • 我需要在Spring批处理中使用JdbcCursorItemReader从select和exec Sybase查询中读取数据。虽然SELECT查询运行正常,但Exec查询遇到以下错误: 原因:组织。springframework。jdbc。UncategorizedSQLException:执行查询;SQL的未分类SQLException[执行过程1];SQL状态[ZZZZZ];错误代码【7773

  • 我正在尝试使用文本文件的内容在MySQL数据库中创建存储过程: 我使用本机查询执行SQL: 但是它在DROP PROCEDURE上得到一个错误我注释了DROP PROCEDURE,然后它在DELIMITER上得到一个错误基本上,它在第一个分号之后的任何一行上都得到一个错误。 似乎JPA hibernate正在解析我的查询并告诉我它有问题,而不是将纯文本传递到MySQL。 sql在MySQL中运行,

  • 问题内容: 我已经写了一个存储过程。除了将表名作为输入参数之外,它都工作正常。 让我们在MySQL中查看我的proc: 存储过程的调用参数: 在这里,服务名称参数可以正常工作。但是,如果我将newsInfoTable变量作为表输入参数包括在内,则会显示错误。 表’db_test.newsinfotable’不存在 为什么只对表参数发生这种情况?如何从此错误中检索或 如何将表名作为参数传递给存储过程

  • 问题内容: 我正在查看MySQL存储过程和函数。真正的区别是什么? 它们似乎相似,但是功能有更多限制。 我可能是错的,但是似乎存储过程可以完成所有工作,而存储函数可以完成更多工作。为什么/何时使用过程与函数? 问题答案: 您不能将存储过程与普通的SQL混合使用,而可以与存储函数混合使用。 例如,如果是一个过程,则无效,但如果是一个函数,则可以这样做。代价是功能比程序具有更多的限制。

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。

  • 问题内容: 我有一个MYSQL存储过程SP1(),它返回一个结果集。 我想在SP2()内部调用SP1()并遍历SP1()的结果集以执行一些其他工作。 我不想从SP1()中包含我的逻辑,因为这会使SP2()过于复杂。 有什么建议么? 谢谢。 问题答案: 您想做的事情听起来并不是特别好,也许您应该考虑重新设计这两个过程。但是,您可以执行以下操作来快速解决此问题: 使您的sp2 sproc将其中间结果写