9

我有一个包含 4 个 UNIONS 和 4 个 LEFT JOINS 的 SQL 查询。它是这样布置的:

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

4 回答 4

5

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

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

于 2012-08-08T16:02:08.053 回答
0

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

于 2012-08-08T16:04:28.333 回答
0

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

从文档中:

UNION 的默认行为是从结果中删除重复的行。可选的 DISTINCT 关键字除了默认值之外没有任何作用,因为它还指定重复行删除。使用可选的 ALL 关键字,不会删除重复行,结果包括所有 SELECT 语句中的所有匹配行。

您可以在同一个查询中混合使用 UNION ALL 和 UNION DISTINCT。混合 UNION 类型的处理方式是 DISTINCT 联合覆盖其左侧的任何 ALL 联合。可以使用 UNION DISTINCT 显式生成 DISTINCT 联合,也可以使用不带 DISTINCT 或 ALL 关键字的 UNION 隐式生成。

于 2012-08-08T16:11:10.760 回答
0

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

  1. 在应用程序和数据库之间创建连接(或从池中使用现有连接)
  2. 查询被发送到数据库
  3. 数据库发回结果
  4. 连接被释放到池

如果您正在运行 N 次查询,上述步骤会发生 N 次,您可以猜到这肯定会减慢进程。所以理想情况下,我们应该尽可能减少查询的数量。

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

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

于 2012-08-08T16:20:18.763 回答