假设我有以下查询。如果在加入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
答案 0 :(得分:21)
答案 1 :(得分:2)
我的猜测是不会有性能损失。查询优化器应该确定t2和t1之间的连接是无效的,并将所有依赖连接解析为常量值,这意味着它们不会被评估。
答案 2 :(得分:0)
优化器在小型查询或仅在小型数据库中表现出色。但是它通常不适用于大型表和复杂的查询。因此,根据我的经验,答案是:
如果联接很少,并且/ 或数据库很小。
您必须仔细地从将要断开的连接中顺序订购连接 大部分数据传递给影响不大的数据 如果表包含数百万个数据,则要管理的数据量 行和/或要建立的联接很多。