出于性能原因,SQL JOIN是否应按特定顺序排列?

时间:2013-02-20 15:08:49

标签: mysql optimization

假设我有以下查询。如果在加入t1和t2时没有匹配,那么MySQL是否忽略了所有其他连接?

我问的原因是,如果没有,那么我将分解查询并使用PHP将它拼凑在一起。如果没有性能损失,那么我将按照这样的顺序放置我的JOIN,一旦前一个JOIN没有,就不会继续。感谢

SELECT whatever
FROM t1
INNER JOIN t2 ON t2.t1id=t1.id
INNER JOIN t3 ON t3.t2id=t2.id
INNER JOIN t4 ON t4.t3id=t3.id
INNER JOIN t5 ON t5.t4id=t4.id
INNER JOIN t6 ON t6.t5id=t5.id
INNER JOIN t7 ON t7.t6id=t6.id
INNER JOIN t8 ON t8.t7id=t7.id
INNER JOIN t9 ON t9.t8id=t8.id
WHERE t1.c=123 AND t4.c=321 AND t6.c=222 AND t9.c=222

3 个答案:

答案 0 :(得分:21)

MySQL的documentation表示“联接优化器计算表应该加入的顺序”。

此订单是根据有关表格大小和其他因素的信息确定的,例如索引的存在。

您应该按照最有意义的顺序放置连接以便阅读和维护查询。

答案 1 :(得分:2)

我的猜测是不会有性能损失。查询优化器应该确定t2和t1之间的连接是无效的,并将所有依赖连接解析为常量值,这意味着它们不会被评估。

答案 2 :(得分:0)

优化器在小型查询或仅在小型数据库中表现出色。但是它通常不适用于大型表和复杂的查询。因此,根据我的经验,答案是:

  • 如果联接很少,并且/ 或数据库很小。

  • 您必须仔细地从将要断开的连接中顺序订购连接 大部分数据传递给影响不大的数据 如果表包含数百万个数据,则要管理的数据量 行和/或要建立的联接很多。