MySQL存储过程与复杂查询对比

24

存储过程的性能如何?使用它们是否值得代替在PHP/MySQL调用中实现复杂查询?

5个回答

23

存储过程能够提供一定的性能提升,但主要用于执行那些使用简单查询难以完成或无法完成的任务。存储过程非常适合简化许多不同类型客户端对数据的访问。与将这些细节留给开发人员不同,数据库管理员喜欢它们,因为它们控制了数据库的使用方式。

要获得更好的性能,请考虑索引和合适的表设计。


16

哎呀,我不希望有人读了这些答案却有了错误的印象。在MySQL与SQL Server/Oracle上,“Stored Whatever”的实现之间有一些非常重要的区别。

请参阅:http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/

每个问这个问题的人都对MySQL的存储过程实现有所假设;他们错误地认为存储过程是编译并存储在全局存储过程缓存中的,类似于Microsoft SQL Server[1]或Oracle[2]中的存储过程缓存。

这是错误的。彻头彻尾的不正确。

这里是真相:每个连接到MySQL服务器的单独维护它自己的存储过程缓存。

花一分钟时间阅读文章和评论。它很简短,你会更好地理解问题。


6

6
粗略地说 - 存储过程的性能与代码相当或稍微优于代码,但会增加数据库服务器的负载。由于大多数数据库系统都关注多用户访问并使���商品硬件作为数据库服务器,使用代码卸载数据库服务器可能会在总体上获胜。对于高端数据库服务器(> 4核,> 32GB RAM),存储过程负载通常不是问题。
存储过程;
1. 查询中传输的数据量较少-对于编写良好的代码,速度提升很小
2. 解析和缓存“稍微好一些”-对于编写良好的代码,速度提升很小
3.将执行负载移至数据库服务器而非客户端(Web服务器),从而可能将负载分散到许多系统。-速度的提高非常依赖于实际代码和包括“多余”数据传输的数据量。相当多的代码传输的数据比实际使用的数据更多(DB库,编写不良的查询,select *等)。
不要过早优化。
存储过程除了速度之外还有许多其他好处,其中安全性排名较高。
在单个程序员环境中,SP编程学习曲线、SP测试框架、多种修订控制方法-SP和代码等可能抵消了这些好处。
学习和使用测试和分析框架将明确回答这个问题,并指导您提供比仅选择SP或特别查询更好的“性能”。
回答“是否值得”的问题-如果您没有建立测试/分析框架,那么您只会猜测。基于我的代码和硬件的任何答案在您的代码和硬件上可能都不相关。
在许多Perl/TCL/PHP/C Web应用程序中使用DB(Sybase、Oracle、MS SQL、MySQL、Postgres)存储过程并不能大大提高整体性能。但我仍然经常使用它们,只是出于性能以外的其他原因。它们可以极大地改善特定复杂查询,但这很少是代码和整体处理时间的主要部分。

2
在MySQL或任何其他SQL服务器(如MSSQL或Oracle)中,存储过程大大提高了涉及查询速度,因为它们已经编译好了。 存储过程比直接查询更安全,并且作为数据库中的对象,可以由所有者进行管理,向每个用户授予正确的访问权限。
使用存储过程还可以隐藏查询和过程的逻辑,并向开发团队和其他程序员提供一个“黑箱”,其中他们插入参数并收到结果。
绝对存储过程很棒!
从MySQL 5.1文档中得知: 在以下情况下,存储例程特别有用:
当多个客户端应用程序以不同的语言编写或在不同的平台上工作,但需要执行相同的数据库操作时。
当安全性至关重要时。例如,银行使用存储过程和函数进行所有常见操作。这提供了一致且安全的环境,并且例程可以确保每个操作被正确记录。在这种设置中,应用程序和用户将无法直接访问数据库表,但只能执行特定的存储过程。
存储例程可以提供改进的性能,因为服务器和客户端之间需要发送的信息较少。 然而这会增加数据库服务器的负载,因为更多的工作是在服务器端完成的,而不是在客户端(应用程序)端。 如果许多客户机器(例如Web服务器)仅由一个或少数几个数据库服务器服务,则应考虑此问题。
存储例程还允许您在数据库服务器中拥有函数库。 这是现代应用程序语言共享的功能,它们可以在内部使用这样的设计(例如,使用类)。 即使在超出数据库使用范围之外,使用这些客户端应用程序语言功能对程序员也是有益的。

2
当前版本的MySQL在执行已建立的会话中的存储过程时不会先编译它们。 - Chris DaMour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接