如果我在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次?
发布于 2012-08-25 13:27:43
在MySQL 5.6之前,内部查询在外层行中每个条目执行一次,很容易证明:
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中的子查询。
发布于 2012-08-25 14:06:01
正如Aaron发布的,MySQL优化器有时是很愚蠢的。如果您没有使用MariaDB最新版本(并且不能等待MySQL 5.6发布),您仍然可以“欺骗”优化器一次运行子查询一次,方法是将它从WHERE移到FROM子句:
SELECT t.STARTDATE, t.ENDDATE
FROM
TEST AS t
JOIN
(SELECT STARTDATE FROM TEST2 LIMIT 1) AS s
ON t.STARTDATE = s.STARTDATE ;https://dba.stackexchange.com/questions/23135
复制相似问题