我有一个简单的SQL请求:
SELECT id, title, resum
FROM film
WHERE id = 56 ;此请求的响应时间几乎等于0.0009秒。
但是,使用有子句的相同查询:
SELECT id, title, resum
FROM film
HAVING id =56 ;给如此大的响应时间,与第一次请求(0.0049秒)。
第一个请求更优化,但是,为什么?你能告诉我造成这么大差异的原因吗?
诚挚的问候。
发布于 2013-09-30 11:17:00
首先,让我们声明最重要的事情:第二个查询不是有效的SQL查询,因为它使用的是扩展的MySQL群。当您将此MySQL扩展关闭时
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';然后就会得到这样的错误:
ERROR 1463 (42000): non-grouping field 'id' is used in HAVING clause因此,您应该真正使用WHERE子句。
但现在是你的实际问题。根据您的度量,我假设在"id“字段上有一个索引。因为HAVING在分组数据上工作(应该工作),所以它没有可以使用的索引。这里有一个大约120万行的MySQL表。索引整数字段上的HAVING查询第一次运行需要16秒,在连续调用时仍然需要0.6秒,而使用WHERE的查询只需要0.04秒。
使用EXPLAIN,MySQL将告诉您它不使用索引:
EXPLAIN SELECT id, title, resum FROM film HAVING id =56;例如,下面是EXPLAIN对我表上的查询的结果:
mysql> EXPLAIN SELECT id, Title FROM `test` HAVING id = 4374354;
+----+-------------+----------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE | test | ALL | NULL | NULL | NULL | NULL | 1201750 | |
+----+-------------+----------+------+---------------+------+---------+------+---------+-------+您可以看到,"key“字段声明"NULL",告诉您没有使用任何索引。相反," rows“字段告诉您,MySQL遍历1201750行(全部)。
mysql> EXPLAIN SELECT id, Title FROM `test` WHERE id = 4374354;
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | test | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+另一方面,EXPLAIN for WHERE告诉我们,它使用“主”索引,因此它只需读取一行,就可以得到更快的响应。
https://stackoverflow.com/questions/19091928
复制相似问题