我应该使用一个大的SQL Select语句还是几个小语句?

时间:2008-09-10 23:02:41

标签: php mysql performance optimization

我正在构建一个包含MySQL发送数据的PHP页面。

拥有

更好吗?
  • 1个SELECT查询,包含4个表连接或
  • 没有表连接的4个小SELECT个查询;我从ID中选择

哪种方法更快,每种方法的pro / con是什么?我每个表只需要一行。

7 个答案:

答案 0 :(得分:17)

你应该运行一个分析工具,如果你真的很担心因为它取决于很多东西而且它可能会有所不同,但通常最好是编译更少的查询和更少的数据库往返。

请确保您使用where和join子句来过滤事物。

但老实说,它通常无关紧要,因为与数据库可以做的相比,你可能不会被击中那么难,所以除非优化是你的规范,否则你不应该过早地做,并且做什么最简单。

答案 1 :(得分:5)

使用JOIN而不是多个查询时,允许数据库应用其优化。您还可能检索不需要的行(如果要用多个选择替换INNER连接),这会增加应用服务器和数据库服务器之间的网络流量。即使它们在同一个盒子上,这也很重要。

答案 2 :(得分:4)

通常,最好有一个SELECT语句。拥有数据库的主要原因之一是它们能够快速处理信息,特别是如果它采用查询格式。

如果这种方法有任何缺点,那就是有一些分析,你不能用一个大的SELECT语句做。 RDBMS纯粹主义者会坚持认为这是一个数据库设计问题,在这种情况下,你回到我原来的建议。

答案 3 :(得分:4)

这可能取决于您从数据库中获取数据后对数据执行的操作。如果单独使用四个结果中的每一个,那么拥有四个单独的SELECT语句将更加合乎逻辑和清晰。另一方面,如果你一起使用所有数据,比如在表格中创建一个统一的行,那么我会使用单个SELECT和JOIN。

我已经完成了一些PHP / MySQL的工作,我发现即使对于有大量JOIN的大型表的查询,数据库也非常擅长优化 - 如果你有智能索引。因此,如果您对表现很认真,请继续阅读query optimization and indexing

答案 4 :(得分:2)

我会说加入1个查询。这样你只需要打一次服务器。如果您的表与索引连接,它应该很快。

答案 5 :(得分:2)

在Oracle下你想要利用查询缓存,如果你在顺序处理中有很多小的查询,如果最后一个查询将第一个查询从缓存中推出,那将会很糟糕...及时让你循环并再次运行第一个查询(显然有不同的参数值)。

我们正在使用Java存储过程构建XML输出文件,并且确实发现每个查询的往返时间都在活着。我们发现在尽可能少的查询中获取所有数据要快得多,然后根据需要将这些值插入到XML DOM中。

唯一的缺点是Java代码不那么优雅,因为数据提取现在远离其使用。但是我们必须在尽可能接近零的时间内生成一个大型的复杂XML文件,因此我们必须优化速度。

答案 6 :(得分:1)

但是在处理合并表时要小心。根据我的经验,尽管在大多数情况下单个连接可能很好,但是当涉及合并表时,您可能会遇到奇怪的情况。