首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子查询为父查询执行1次或更多次?

问子查询为父查询执行1次或更多次?
EN

Database Administration用户
提问于 2012-08-25 12:54:53
回答 2查看 4.8K关注 0票数 4

如果我在where子句中应用静态数据,它比应用子查询更快。示例:

(查询返回5条记录作为结果集)

SELECT STARTDATE, ENDDATE FROM TEST WHERE STARTDATE = '2012-08-21';

比这更快:

SELECT STARTDATE, ENDDATE FROM TEST WHERE STARTDATE = (SELECT STARTDATE FROM TEST2 LIMIT 1);

或者他们在任何情况下都是一样的?

子查询每次执行一次比较,对每条记录执行查询,还是只执行1次?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2012-08-25 13:27:43

在MySQL 5.6之前,内部查询在外层行中每个条目执行一次,很容易证明:

代码语言:javascript
复制
mysql> SELECT COUNT(*) FROM sample_data;
+----------+
| COUNT(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM sample_data WHERE id = (SELECT SLEEP(1) );
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
1 row in set (8.00 sec)

请注意,查询耗时8秒,因此对sample_data中的每一行执行8次睡眠(1)。

MySQL 5.6实施了子查询物化,从理论上讲,这将在许多情况下防止这种情况发生。MariaDB还有一个大大改进的优化器,可以防止这种情况发生。

在大多数情况下,最好避免MySQL中的子查询。

票数 8
EN

Database Administration用户

发布于 2012-08-25 14:06:01

正如Aaron发布的,MySQL优化器有时是很愚蠢的。如果您没有使用MariaDB最新版本(并且不能等待MySQL 5.6发布),您仍然可以“欺骗”优化器一次运行子查询一次,方法是将它从WHERE移到FROM子句:

代码语言:javascript
复制
SELECT t.STARTDATE, t.ENDDATE 
FROM 
    TEST AS t 
  JOIN 
    (SELECT STARTDATE FROM TEST2 LIMIT 1) AS s
  ON t.STARTDATE = s.STARTDATE ;
票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/23135

复制
相关文章

相似问题

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