MySQL存储过程与复杂查询

Ars*_*ham 20 php mysql performance

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

小智 17

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

查看索引和正确的表设计以获得更好的性能.


Mik*_*son 11

我喜欢有人读这些答案并给人留下错误的印象."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服务器的每一个连接都维护着它自己的存储过程缓存.

花一点时间阅读本文的其余部分和评论.这很简短,您将对这些问题有更好的理解.


Mad*_*urf 6

正如 JohnFX 在之前的回答中向我指出的那样:

“存储过程的性能优势是可疑的,充其量是最小的。关于这一点的一些阅读材料:

http://statestreetgang.net/post/2008/04/My-Statement-on-Stored-Procedures.aspx

http://betav.com/blog/billva/2006/05/are_stored_procedures_faster_t.html

享受。


小智 6

大大简化 - 存储过程的性能等于或略优于代码,但代价是数据库服务器负载。由于大多数数据库系统都关心多用户访问,并且正在为数据库服务器使用商用硬件,因此使用卸载数据库服务器的代码可能会总体获胜。对于高端数据库服务器,> 4 核,> 32GB RAM,SP 负载通常不是问题。

存储过程;

  1. 在查询中传输更少的数据 - 编写良好的代码的速度提升最小
  2. 解析和缓存“稍微好一点”——编写良好的代码的速度提升最小
  3. 将执行负载转移到数据库服务器而不是客户端(Web 服务器),可能会将负载分散到许多系统上。- 速度改进很大程度上取决于实际代码和数据量,包括传输的“多余”数据。相当多的代码传输的数据比实际使用的数据多(数据库库、写得不好的查询、select * 等)

不要过早优化。

除了速度之外,存储过程还有许多其他优点,其中安全性是最重要的。

在单一程序员环境中,好处可能会被 SP 编程学习曲线、SP 测试框架、多种版本控制方法(SP 和代码)等所抵消。

学习和使用测试和分析框架将明确回答这个问题,并将指导您为应用程序提供比简单选择 SP 或临时查询更好的“性能”。

回答“是否值得”——如果您没有适当的测试/分析框架,您只能猜测。基于我的代码和硬件的任何答案可能与您的无关。

我在许多使用数据库(Sybase、Oracle、MS SQL、MySQL、Postgres)存储过程的 Perl/TCL/PHP/C Web 应用程序上的实际经验并没有显着提高总体性能。但我仍然经常使用它们,只是出于性能以外的其他原因。它们可以极大地改进特定的复杂查询,但这很少是大部分代码和总体处理时间。