我们正处于一个新项目的开始阶段,我们真的想知道是否应该在MySQL中使用存储过程。
我们仅使用存储过程来插入和更新业务模型实体。有几个表代表模型实体,我们将在那些存储过程insert / update中抽象它。
另一方面,我们可以从Model层调用insert和update,但不能在MySQL中调用,而是在PHP中调用。
根据您的经验,哪个是最佳选择?两种方法的优点和缺点。哪个是高性能最快的?
PS:这是一个大多数读取和高性能的Web项目是最重要的必备条件。
答案 0 :(得分:60)
与实际的编程语言代码不同,它们是:
如果您有一个特定于数据库的操作(例如,用于维护数据库完整性的事务内操作),或者保持您的过程非常原子和简单,那么您可能会考虑它们。
建议在预先指定“高性能”时注意。它往往导致糟糕的选择而牺牲良好的设计,它会比你想象的更快地咬你。
使用存储过程自担风险(来自曾经去过那里且永远不想回去的人)。我的建议是像瘟疫一样避免它们。
答案 1 :(得分:27)
与编程代码不同,它们是:
答案 2 :(得分:13)
至于表演,他们在未来的MySQL版本中具有真正具有高性能的潜力(在SQL Server或Oracle下,它们是真正的享受!)。然而,对于所有其他......他们完全爆发了竞争。我将总结一下:
安全性:您可以只为您的应用提供EXECUTE权限,一切都很好。您的SP将插入更新选择...,没有任何可能的泄漏。它意味着对您的模型的全局控制,以及强制数据安全性。
安全性2:我知道这种情况很少见,但有时PHP代码会从服务器泄漏出来(即公开可见)。如果它包含您的查询,可能的攻击者会知道您的模型。这很奇怪,但无论如何我想发信号
任务组:是的,创建高效的SQL SP需要一些特定的资源,有时候会更昂贵。但是如果你认为你不需要这些资源只是因为你在你的客户端集成了你的查询......你就会遇到严重的问题。我提到了Web开发的类比:将视图与其他视图分开是很好的,因为您的设计人员可以使用他们自己的技术,而程序员可以专注于编写业务层。
封装业务层:使用存储过程完全隔离它所属的业务:该死的数据库。
快速测试:shell下有一个命令行,您的代码已经过测试。
独立于客户端技术:如果明天你想从php切换到其他东西,没问题。好吧,只是将这些SQL存储在一个单独的文件中也可以解决问题,这是正确的。另外,关于如果你决定切换sql引擎的评论中的好点,你还有很多工作要做。无论如何,你必须有充分的理由这样做,因为对于大型项目和大公司来说,这很少发生(主要是由于成本和人力资源管理)
实施敏捷3 +层开发:如果您的数据库与客户端代码不在同一台服务器上,则可能有不同的服务器,但只有一台服务器用于数据库。在这种情况下,当您需要更改SQL相关代码时,您不必升级任何php服务器。
好的,我认为这是我在这个问题上最重要的事情。我在两种灵魂(SP vs client)中都有所发展,我真的非常喜欢SP风格。我只是希望Mysql有一个真正的IDE为他们,因为现在它是一种痛苦的屁股有限。
答案 3 :(得分:7)
存储过程很好用,因为它们可以使您的查询井井有条,并允许您一次执行批处理。存储过程通常可以快速执行,因为它们是预编译的,与每次运行时编译的查询不同。这对数据库位于远程服务器上的情况有很大影响;如果查询在PHP脚本中,则应用程序和数据库服务器之间存在多个通信 - 查询将被发送,执行并返回结果。但是,如果使用存储过程,则只需要发送一个小的CALL语句而不是大而复杂的查询。
可能需要一段时间才能适应编程存储过程,因为它们有自己的语言和语法。但是,一旦你习惯了它,你会发现你的代码非常干净。
就性能而言,如果您使用存储过程,则可能无法获得任何重大收益。
答案 4 :(得分:5)
我会让我知道我的意见,尽管我的强硬可能与这个问题没有直接关系。:
与许多问题一样,关于使用存储过程或应用程序层驱动的解决方案的回复依赖于将推动整体工作的问题:
您是尝试进行批量操作还是在线操作?他们是完全交易的吗?这些行动有多复发?等待数据库的工作量有多重?
您拥有什么样的数据库技术?什么样的基础设施?您的团队是否接受过数据库技术的全面培训?您的团队是否能够更好地构建数据库诊断解决方案?
没有秘密。
您的解决方案是否需要分发到多个位置?是您使用远程通信所需的解决方案吗?您的解决方案是在多个数据库服务器上工作,还是可能使用基于群集的架构?
需要更改多少申请?你有经过专门培训的个人维护解决方案吗?
您是否看到您的数据库技术会在短时间,中期,长时间内发生变化?您是否会看到需要经常迁移解决方案?
使用一种或另一种策略实施该解决方案需要多少费用?
这些要点的总体结果将成为答案。因此,在决定是否使用任何策略时,您必须关注每一点。有些情况下,存储过程的使用优于应用程序层管理的查询,而其他情况下,执行查询和使用基于应用程序层的解决方案时最好。
在以下情况下使用存储过程往往更加充分:
在以下情况下使用应用层驱动的解决方案往往更加充分:
希望这可能有助于任何人问自己什么是更好用。
答案 5 :(得分:3)
我建议你不要使用存储过程:
相反,我建议创建一个图层/库并将所有查询放在那里
你可以
关于表现:
答案 6 :(得分:2)
如果您的数据库很复杂而不是具有响应的论坛类型,但真正的仓储SP肯定会受益。你可以在那里解决所有的业务逻辑,而不是一个开发人员会关心它,他们只是打电话给你的SP。我一直这样做加入超过15个表并不好玩,你无法向新开发者解释这个。
开发人员也无法访问数据库,太棒了!把它留给数据库设计者和维护者。如果您还决定要更改表结构,则可以将其隐藏在界面后面。 n-tier,记得??
高性能和关系数据库不是一起出现的,即使MySQL InnoDB很慢,MyISAM也应该被抛到窗外。如果您需要使用Web应用程序进行性能,则需要适当的缓存,内存缓存或其他。
在你的情况下,因为你提到'Web'我不会使用存储过程,如果它是数据仓库我肯定会考虑它(我们使用SP作为我们的仓库)。
提示: 既然你提到了Web项目,那么有关nosql的解决方案吗?另外,你需要一个快速的DB,为什么不使用PostgreSQL呢? (试图在这里提倡...)
答案 7 :(得分:2)
我以前使用MySql并且我对sql的理解充其量很差,我花了相当多的时间使用Sql Server,我清楚地分离了数据层和应用层,我目前正在寻找一个服务器0.5太字节。
有时我没有使用ORM感到沮丧,因为存储过程的开发速度非常快,速度要慢得多。我认为通过使用ORM可以加快我们的大部分工作。
当您的应用程序达到临界质量时,ORM性能将受到影响,编写良好的存储过程将更快地为您提供结果。
作为性能的一个例子,我在应用程序中收集10种不同类型的数据,然后将其转换为XML,我在存储过程中处理,我只有一次调用数据库而不是10次。
Sql非常擅长处理数据集,让我感到沮丧的一件事是当我看到有人从原始形式的sql获取数据并使用应用程序代码循环结果和格式并将它们分组时,这真的是不好的做法。
我的建议是学习和理解sql,你的应用程序才会真正受益。
答案 8 :(得分:1)
我建议您远离数据库特定的存储过程。
我经历了很多项目,他们突然想要切换数据库平台,而SP内部的代码通常不是很便携=额外的工作和可能的错误。
存储过程开发还要求开发人员直接访问SQL引擎,因为项目中的任何人都可以通过代码访问来更改正常连接。
关于你的模型/图层/层次的想法:是的,坚持下去。
这样您就可以维持层之间的逻辑级别。如果只是DL调用看起来非常慢,你可以开始使用存储过程,但是如果你突然需要将数据库转移到一个全新的平台,那么可以在某处维护原始的非SP代码。通过业务中的所有云托管,您永远不会知道什么是下一个数据库平台......
出于同样的原因,我密切关注亚马逊AWS。
答案 9 :(得分:1)
这里有很多信息让人迷惑,软件开发是一种进化。我们20年前所做的事情现在不是最好的做法。回到使用经典客户端服务器的那一天,除了SP之外,你不会想到任何东西。
对于课程来说,这绝对是马匹,如果你是一个大型组织,你将使用多层,可能是SP,但你会关心它们,因为一个专门的团队将把它们整理出来。
相反,我发现自己试图快速敲定一个Web应用程序解决方案,这可以满足业务需求,离开开发人员(远程对我)来敲除页面和SQL查询是非常快的定义数据库结构。
然而,复杂性正在增长,并且没有简单的方法来提供API,我盯着使用SP来包含业务逻辑。我认为它运作良好且合情合理,我控制它是因为我可以构建逻辑并为我的离岸开发人员提供一个简单的结果集来构建前端。
如果我发现我的软件取得了非凡的成功,那么就会出现更多关注点的分离,并且会出现不同的n teir实现,但是现在SP是完美的。
您应该知道所有可用的工具集,并且与之匹配是明智的。除非你建立一个企业系统,然后快速而简单是最好的。
答案 10 :(得分:0)
我认为关于数据库存储的查询有很多错误信息。
如果您要对数据进行许多静态查询,我建议您使用MySQL存储过程。特别是如果您要将事物从一个表移动到另一个表(即出于某种原因从活动表移动到历史表)。当然,这样做有个缺点,那就是必须单独记录更改的日志(理论上,您可以创建一个表,该表仅保存DBA更新的存储过程的更改)。如果您有许多不同的应用程序与数据库连接,特别是如果您说有一个用C#编写的桌面程序和一个用PHP编写的Web程序,那么将某些过程存储在数据库中可能是更有利的,因为它们是与平台无关的。
该网站上有一些有趣的信息,您可能会觉得有用。
https://www.sitepoint.com/stored-procedures-mysql-php/
与往常一样,首先构建沙箱,然后进行测试。
答案 11 :(得分:-2)
尝试从框架更新实时系统上的100,000,000条记录,然后让我知道它的运行方式。对于小型应用程序来说,SP不是必须的,但对于大型的严肃系统来说,它们是不二之选。