Mysql 使用WHERE和HAVING查询响应时间

Mysql 使用WHERE和HAVING查询响应时间,mysql,query-optimization,where,having,Mysql,Query Optimization,Where,Having,我有一个简单的SQL请求: SELECT id, title, resum FROM film WHERE id = 56 ; 此请求的响应时间几乎等于0.0009秒 鉴于,同一查询使用Having子句: SELECT id, title, resum FROM film HAVING id =56 ; 与第一个请求相比,给出如此大的响应时间(0.0049秒) 第一个请求更优化,但是,为什么? 你能告诉我造成如此巨大差异的原因吗 致以最良好的祝愿 首先,让我们说明最重要的一点:您的第二个查询

我有一个简单的SQL请求:

SELECT id, title, resum
FROM film
WHERE id = 56 ;
此请求的响应时间几乎等于0.0009秒

鉴于,同一查询使用Having子句:

SELECT id, title, resum
FROM film
HAVING id =56 ;
与第一个请求相比,给出如此大的响应时间(0.0049秒)

第一个请求更优化,但是,为什么? 你能告诉我造成如此巨大差异的原因吗


致以最良好的祝愿

首先,让我们说明最重要的一点:您的第二个查询不是有效的SQL查询,因为它使用了。当您使用关闭此MySQL扩展时

SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
然后会出现如下错误:

ERROR 1463 (42000): non-grouping field 'id' is used in HAVING clause
因此,您应该真正使用
WHERE
子句

但现在谈谈你的实际问题。根据您的测量,我假设“id”字段上有一个索引。因为
对分组数据有效(应该有效),所以它不能使用索引。我这里有一个MySQL表,大约有120万行。
对索引整数字段进行
查询在第一次运行时需要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(全部)行

另一方面,
EXPLAIN
for
WHERE
告诉我们,它使用“主”索引,因此只需读取一行,从而获得更快的响应

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 |       |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+