Mysql 使用WHERE和HAVING查询响应时间
我有一个简单的SQL请求: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秒) 第一个请求更优化,但是,为什么? 你能告诉我造成如此巨大差异的原因吗 致以最良好的祝愿 首先,让我们说明最重要的一点:您的第二个查询
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
forWHERE
告诉我们,它使用“主”索引,因此只需读取一行,从而获得更快的响应
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 | |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+