JOIN 子句中的 MySQL 逻辑评估是不是延迟/短路?

Posted

技术标签:

【中文标题】JOIN 子句中的 MySQL 逻辑评估是不是延迟/短路?【英文标题】:Is MySQL logic evaluation lazy/short-circuiting in JOIN clause?JOIN 子句中的 MySQL 逻辑评估是否延迟/短路? 【发布时间】:2012-05-31 14:25:48 【问题描述】:

取如下表达式:FALSE AND (expression)

一旦看到FALSEmysql 会评估表达式还是继续前进?

一些背景背景——我想通过以下方式加快查询速度:

JOIN... ON (indexed_column1=indexed_column2 AND non_indexed_column_a=non_indexed_column_b)

关于我为什么要进行此查询的背景see this answer

如果它总是评估non_indexed_column_a=non_indexed_column_b,那么不会节省时间。

【问题讨论】:

我认为查询优化器会完全消除这种微不足道的情况。但是,在无法静态消除的情况下,诸如 SQL Server(已授予,而非 MySQL)等引擎不保证评估顺序;因为这实际上可以帮助他们更有效地使用索引等。知道 MySQL 特定的实现是如何工作的会很有趣,+1。 ***.com/questions/789231/…(不是特定于 MySQL 的,但也很好),***.com/questions/4449105/mysql-and-condition 嗯,我太喜欢第一个链接问题中的答案了。毕竟投票结束。 (尽管编辑后的“JOIN”而不是“WHERE”可能略有不同。) 见手册:dev.mysql.com/doc/internals/en/… @Omesh:你应该发帖作为答案。 【参考方案1】:

MySQL 查询优化器尽可能使用索引,并使用最严格的索引来消除尽可能多的行。

因此,对于您的查询,它将始终根据第一个索引列过滤记录,然后从非索引列中过滤记录。

同样在查询执行之前,MySQL 会消除总是错误的代码 (Dead Code)。

更多详情见:http://www.informit.com/articles/article.aspx?p=377652&seqNum=2

【讨论】:

以上是关于JOIN 子句中的 MySQL 逻辑评估是不是延迟/短路?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL内连接(INNER JOIN)

强制 MySQL 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?

MySQL select in join 子句扫描太多行

在 WHERE 子句中使用连接列时,Mysql 未在 LEFT JOIN 中使用索引

使用 WHERE 子句中的过滤器优化 OUTER JOIN 查询。(查询规划器)

Mysql 使用 JOIN 获取过去六周的数据