mysql SQL JOIN是否应出于性能原因而按特定顺序放置?

tyky79it  于 2023-08-02  发布在  Mysql
关注(0)|答案(4)|浏览(99)

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

字符串

e4yzc0pl

e4yzc0pl1#

MySQL的documentation声明“连接优化器计算表应该被连接的顺序”。
此顺序是根据有关表大小的信息和其他因素(如是否存在索引)确定的。
您应该按照对阅读和维护查询最有意义的顺序放置联接。

nimxete2

nimxete22#

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

h6my8fg2

h6my8fg23#

优化器只在小型查询或小型数据库中工作得很好。但它通常不能很好地处理大型表和复杂查询。根据我的经验,答案是:

  • 如果连接的数量很少和/或数据库很小,则可以忽略连接的顺序。
  • 如果你的表包含数百万行和/或你所做的连接很多,你必须仔细地对连接进行排序,从一个会切断大部分数据的连接到一个不会影响要管理的数据量的连接。
emeijp43

emeijp434#

尽管从逻辑上讲,连接顺序对你指定的查询没有任何影响,而且SQL应该是一种声明性语言,但不幸的是,mysql优化器非常基本,你指定的连接表的顺序可能会产生巨大的性能差异。在我处理过的一个场景中,将连接从第二个表移动到第三个表,将查询执行时间从32秒更改为25毫秒!

相关问题