MySQL存储过程与复杂查询

时间:2009-07-20 00:05:11

标签: php mysql performance

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

5 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

Yikes我讨厌有人阅读这些答案并得到错误的印象。 “MySQL”与“SQL server / Oracle”上的“Stored Whatever”实现之间存在一些非常重要的差异。

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

  

每个提出这个问题的人都会假设有关于MySQL的问题   存储过程实现;他们错误地相信存储   程序被编译并存储在全局存储过程缓存中,   类似于Microsoft SQL Server [1]或中的存储过程缓存   甲骨文[2]。

     

这是错误的。持平不合理。

     

这是事实:与MySQL服务器的每一个连接   维护它自己的存储过程缓存。

请花一点时间阅读本文的其余部分和评论。这很简短,你会对这些问题有更好的了解。

答案 2 :(得分:4)

正如之前在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

享受。

答案 3 :(得分:2)

在MySQL或任何其他SQL服务器(如MSSQL或Oracle)中,存储过程会大大提高所涉及查询的速度,因为这已经编译过了。存储过程比直接查询更安全,并且作为数据库中的对象,它们可以由所有者管理,从而为每个用户提供正确的访问权限。

使用存储过程,您还可以隐藏查询和过程的逻辑,并向开发团队和其他程序员提供一个“黑盒子”,它们会插入参数并接收结果。

明确存储的程序摇滚!!!!

来自MySQL 5.1文档: 存储例程在某些情况下特别有用:

当多个客户端应用程序使用不同语言编写或在不同平台上工作时,需要执行相同的数据库操作。

当安全性至关重要时。例如,银行使用存储过程和函数进行所有常见操作。这提供了一致且安全的环境,并且例程可以确保正确记录每个操作。在这样的设置中,应用程序和用户无法直接访问数据库表,但只能执行特定的存储例程。

存储例程可以提供更高的性能,因为需要在服务器和客户端之间发送更少的信息。权衡的是,这确实增加了数据库服务器上的负载,因为更多的工作在服务器端完成,而在客户端(应用程序)端完成的工作则更少。如果许多客户端计算机(例如Web服务器)仅由一个或几个数据库服务器提供服务,请考虑这一点。

存储例程还允许您在数据库服务器中拥有函数库。这是现代应用程序语言共享的功能,允许在内部进行此类设计(例如,通过使用类)。即使在数据库使用范围之外,使用这些客户端应用程序语言功能对程序员也是有益的。

答案 4 :(得分:2)

大致简化 - 以db服务器负载为代价,存储过程性能等于或稍微优于代码。由于大多数数据库系统都关注多用户访问并且正在为数据库服务器使用商用硬件,因此使用代码卸载数据库服务器可能总体上会获胜。对于高端DB服务器,&gt; <4核,> 32gb ram,SP负载通常不是问题。

存储程序;

  1. 在查询中传输较少的数据 - 为编写良好的代码提高速度,
  2. 解析&amp;缓存“稍好一点” - 对于编写良好的代码,速度提升最小
  3. 将执行负载移至数据库服务器与客户端(Web服务器),可能会将负载分散到许多系统上。 - 速度的提高在很大程度上取决于实际的代码和数据量,包括传输的“过量”数据。相当多的代码传输的数据比实际使用的数据多(数据库库,编写不良的查询,选择*等)。
  4. 不要尽早优化。

    存储过程除了速度之外还有许多其他好处,安全性在列表中很高。

    在单个程序员环境中,SP编程学习曲线,SP测试框架,多种修订控制方法 - SP和代码等可以抵消好处。

    学习和使用测试和分析框架将明确回答这一问题,并指导您为应用程序提供更好的“性能”,而不仅仅是选择SP或即席查询。

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

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