对SQL中的联合或单独的查询更好,然后使用php array_merge?

时间:2012-08-08 16:00:15

标签: php mysql

我有一个SQL查询,有4个UNIONS和4个LEFT JOINS。它是如此布局:

SELECT ... FROM table1
    LEFT JOIN other_table1
UNION SELECT ... FROM table2
    LEFT JOIN other_table2
UNION SELECT ... other_table3
    LEFT JOIN other_table3
UNION SELECT ... FROM table4
    LEFT JOIN other_table4

运行4个单独的查询然后在事后将结果与php合并会不会更好?或者我应该把它们放在一起?哪个会提供最快的执行?

4 个答案:

答案 0 :(得分:5)

最明确的答案是测试每个方法,但UNION最有可能更快,因为MySQL只运行一个查询,而联盟的每个部分只运行4个查询。

您还可以消除在PHP中将数据读入内存并连接它的开销。相反,您可以在一个结果上执行while()foreach()或其他任何操作。

答案 1 :(得分:0)

在这种情况下,它取决于您将从结果中获得的记录数。由于您在所有联盟中使用左联接,我建议您执行不同的抓取以避免SQL中的瓶颈并将结果合并到PHP

答案 2 :(得分:0)

UNION子句可以更快,因为它将立即返回不同的记录(不会返回重复的记录),否则您需要在应用程序中执行此操作。此外,在这种情况下,它可能有助于减少流量。

来自文档:

  

UNION的默认行为是从中删除重复的行   结果。可选的DISTINCT关键字除了以外没有任何效果   默认,因为它还指定重复行删除。随着   可选的ALL关键字,不会发生重复行删除和   result包含所有SELECT语句中的所有匹配行。

     

您可以在同一查询中混合使用UNION ALL和UNION DISTINCT。混合的UNION   对类型进行处理,使得DISTINCT联合覆盖任何ALL联合   在它的左边。可以使用显式生成DISTINCT联合   UNION DISTINCT或隐式使用UNION而没有以下DISTINCT   或所有关键字。

答案 3 :(得分:0)

从编程语言执行查询时,会执行以下步骤

  1. 在应用程序和数据库之间创建连接(或从池中使用现有连接)
  2. 将查询发送到数据库
  3. 数据库将结果发回
  4. 连接已发布到池
  5. 如果您正在运行N个查询,则上述步骤会发生N次,您可以猜测这肯定会减慢进程。因此,理想情况下,我们应尽可能减少查询次数。

    如果单个查询变得复杂并且难以维护并且需要花费大量时间来执行,那么将查询分成多个部分是有意义的。在这种情况下,好的方法是优化查询本身。

    在你的情况下,查询非常简单,并且有人指出union也有助于删除重复的行,最好的方法是使用sql查询而不是php代码。尝试优化技术,例如在表上创建适当的索引。