如果我在where子句中应用静态数据,那么应用子查询会更快.例:
(查询返回5条记录作为结果集)
选择STARTDATE,ENDDATE FROM TEST STARTDATE =’2012-08-21′;
比那更快:
SELECT STARTDATE,ENDDATE FROM TEST WHERE STARTDATE =(从TEST2 LIMIT 1开始选择STARTDATE);
或者它们在任何情况下是相同的?
每次通过查询与每条记录进行比较或仅进行1次时,子查询会执行吗?
解决方法:
在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秒,因此SLEEP(1)执行8次,sample_data中的每一行执行一次.
MySQL 5.6实现了subquery materialization,从理论上讲,它可以防止在许多情况下发生这种情况. MariaDB还有一个大大改进的优化器,可以防止这种情况.
在大多数情况下,最好避免使用MySQL中的子查询.
标签:mysql,select
来源: https://codeday.me/bug/20190806/1595564.html