【问题标题】:Should SQL JOINs be placed in particular order for performance reasons?出于性能原因,是否应按特定顺序放置 SQL JOIN?
【发布时间】:2013-02-05 15:36:00
【问题描述】:

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

【问题讨论】:

标签: mysql optimization


【解决方案1】:

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

【讨论】:

  • 谢谢史蒂夫。我的猜测和你的一样。你认为你有多确定?
【解决方案2】:

MySQL 的 documentation 声明“连接优化器计算应连接表的顺序”。

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

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

【讨论】:

  • 谢谢戈登。因此,“我”放入哪个顺序并不重要,因为 MySQL 会为我做这件事。 MySQL 是否有可能以与我列出的顺序不同的顺序排列它们,这会导致执行一堆它们?
  • MySQL 将完成所有的连接。如果您在其他表中的 id 列上有索引,那么引擎将使用该索引并且性能应该不是问题。
  • 感谢您引用文档!
  • 连接顺序很重要,当查询很复杂并且优化器放弃寻找更好的顺序时,它会产生很大的不同。当您有大型表和多个连接时,这很常见。在我的经验中,我没有看到顺序优化的查询运行速度非常慢,并且只是改变连接的顺序非常快。因此,这取决于您拥有的查询和数据库:需要的最复杂、最精细的连接。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2013-11-05
    • 2022-01-20
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多