MySQL JOIN子查询ON FALSE。子查询会执行吗?

时间:2015-05-27 23:11:31

标签: mysql join

考虑这个MySQL查询

SELECT <cols> FROM <tbl> INNER|LEFT JOIN (SELECT ...) AS sub_query ON FALSE

当然,无论 tbl sub_query 中的内容是什么,都会产生空结果集,因为ON语句始终为false。

在我的情况下,我能控制的唯一部分是ON语句。

我的问题是,MySQL是否足够智能来检测?然后跳过完全运行子查询并立即返回空结果集?

2 个答案:

答案 0 :(得分:2)

我们可以测试一下:

mysql> explain select * from mdl_user join (select 1) q on false;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra            |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
|  1 | PRIMARY     | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE |
|  2 | DERIVED     | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used   |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
2 rows in set (0.02 sec)

mysql> select * from mdl_user join (select 1) q on false;
Empty set (0.00 sec)

这似乎表明是的,MySQL检测到on false条件,并且不会对整个连接感到烦恼。

(抱歉,我当时埋葬了moodle数据库)

答案 1 :(得分:1)

评论太长了。

如果MySQL足够聪明在实践中在真实查询中执行此操作,我会感到惊讶。您应该测试自己的数据。

然而,documentation表明它有可能:

  

对于非EXPLAIN查询,延迟实现可能不会导致   不得不这样做。考虑一个连接结果的查询   FROM子句中的子查询到另一个表:如果是优化器   首先处理其他表并发现它不返回任何行,   连接不需要进一步执行,优化器可以   完全跳过实现子查询。

相关问题