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)
一旦看到FALSE
,mysql 会评估表达式还是继续前进?
一些背景背景——我想通过以下方式加快查询速度:
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 从 WHERE IN 子句返回重复项而不使用 JOIN/UNION?
在 WHERE 子句中使用连接列时,Mysql 未在 LEFT JOIN 中使用索引