首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对FALSE的MySQL连接子查询。子查询会执行吗?

问对FALSE的MySQL连接子查询。子查询会执行吗?
EN

Stack Overflow用户
提问于 2015-05-27 23:11:31
回答 2查看 272关注 0票数 1

考虑一下这个MySQL查询

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

当然,无论tbl或sub_query中有什么内容,这都会产生一个空的结果集,因为ON语句总是错误的。

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

我的问题是,MySQL是否足够聪明,能够检测到这一点?然后跳过运行子查询并立即返回空结果集?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-28 00:25:05

我们可以试试这个:

代码语言:javascript
复制
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条件,而不需要处理整个联接。

(对不起,当时我被埋在一个情绪化的数据库里)

票数 2
EN

Stack Overflow用户

发布于 2015-05-27 23:16:32

这太长了,不能发表评论。

如果MySQL在实践中足够聪明,能够在真正的查询中做到这一点,我会感到惊讶。你应该测试你自己的数据。

然而,文档认为这是一种可能性:

对于非解释的查询,延迟物化可能导致根本不必这样做。考虑将FROM子句中的子查询结果连接到另一个表的查询:如果优化器首先处理该其他表,发现它不返回任何行,则不需要进一步执行联接,优化器可以完全跳过子查询的物化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30494661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档