考虑一下这个MySQL查询
SELECT <cols> FROM <tbl> INNER|LEFT JOIN (SELECT ...) AS sub_query ON FALSE
当然,无论tbl或sub_query中有什么内容,这都会产生一个空的结果集,因为ON语句总是错误的。
在我的情况下,我唯一能控制的部分是ON语句。
我的问题是,MySQL是否足够聪明,能够检测到这一点?然后跳过运行子查询并立即返回空结果集?
发布于 2015-05-28 00:25:05
我们可以试试这个:
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条件,而不需要处理整个联接。
(对不起,当时我被埋在一个情绪化的数据库里)
发布于 2015-05-27 23:16:32
这太长了,不能发表评论。
如果MySQL在实践中足够聪明,能够在真正的查询中做到这一点,我会感到惊讶。你应该测试你自己的数据。
然而,文档认为这是一种可能性:
对于非解释的查询,延迟物化可能导致根本不必这样做。考虑将FROM子句中的子查询结果连接到另一个表的查询:如果优化器首先处理该其他表,发现它不返回任何行,则不需要进一步执行联接,优化器可以完全跳过子查询的物化。
https://stackoverflow.com/questions/30494661
复制相似问题