我有一个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合并会不会更好?或者我应该把它们放在一起?哪个会提供最快的执行?
答案 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)
从编程语言执行查询时,会执行以下步骤
如果您正在运行N个查询,则上述步骤会发生N次,您可以猜测这肯定会减慢进程。因此,理想情况下,我们应尽可能减少查询次数。
如果单个查询变得复杂并且难以维护并且需要花费大量时间来执行,那么将查询分成多个部分是有意义的。在这种情况下,好的方法是优化查询本身。
在你的情况下,查询非常简单,并且有人指出union也有助于删除重复的行,最好的方法是使用sql查询而不是php代码。尝试优化技术,例如在表上创建适当的索引。