考虑这个MySQL查询
SELECT <cols> FROM <tbl> INNER|LEFT JOIN (SELECT ...) AS sub_query ON FALSE
当然,无论 tbl 或 sub_query 中的内容是什么,都会产生空结果集,因为ON
语句始终为false。
在我的情况下,我能控制的唯一部分是ON语句。
我的问题是,MySQL是否足够智能来检测?然后跳过完全运行子查询并立即返回空结果集?
答案 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子句中的子查询到另一个表:如果是优化器 首先处理其他表并发现它不返回任何行, 连接不需要进一步执行,优化器可以 完全跳过实现子查询。