16

假设我有以下查询。如果连接 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
4

3 回答 3

23

MySQL的文档指出“连接优化器计算应连接表的顺序”。

此顺序是根据有关表大小和其他因素(例如是否存在索引)的信息确定的。

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

于 2013-02-20T15:47:55.747 回答
2

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

于 2013-02-20T15:22:17.477 回答
1

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

  • 如果它们很少和/或数据库很小,您可以忘记连接的顺序。

  • 如果您的表包含数百万行和/或您正在创建的连接,您必须仔细排序连接,从一个会切断大部分数据的连接到一个对要管理的数据量影响不大的连接很多。

于 2020-10-08T10:13:16.497 回答