mysql - 使用 WHERE 和 HAVING 查询响应时间

标签 mysql query-optimization where-clause having

我有一个简单的 SQL 请求:

SELECT id, title, resum
FROM film
WHERE id = 56 ;

此请求的响应时间几乎等于 0.0009 秒

然而,相同的查询,使用having Clause:

SELECT id, title, resum
FROM film
HAVING id =56 ;

与第一个请求相比,响应时间如此之长(0.0049 秒)。

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

最诚挚的问候。

最佳答案

首先,让我们声明最重要的事情:您的第二个查询不是有效的 SQL 查询,因为它使用 MySQL GROUP BY extensions 。当您使用

关闭此 MySQL 扩展时
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';

然后你会得到这样的错误:

ERROR 1463 (42000): non-grouping field 'id' is used in HAVING clause

因此,您确实应该使用 WHERE 子句。

现在回答你的实际问题。我根据您的测量假设,“id”字段上有一个索引。因为 HAVING 对分组数据起作用(应该起作用),所以它没有可以使用的索引。我这里有一个 MySQL 表,大约有 120 万行。对索引整数字段的 HAVING 查询首次运行需要 16 秒,连续调用仍需要大约 0.6 秒,而使用 WHERE 的查询只需要 0.04 秒。 p>

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

另一方面,WHEREEXPLAIN 告诉我们,它使用“PRIMARY”索引,因此它只需要读取一行,从而导致响应速度更快。

关于mysql - 使用 WHERE 和 HAVING 查询响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19091928/

相关文章:

mysql - 如何对 mysql 结果集应用过滤器

Mysql在同一列中加入多个索引

mysql - MySQL 数据库中 ISBN10 和 ISBN13 的最佳数据类型是什么

Oracle 相当于 SQLite 的 quote() 函数

php - 如何优化此查询以生成许多逗号分隔的数据?

sql-server - 如何使用嵌套循环加速查询

PHP登录表单失败

mysql - 数据透视表的 SQL 查询

php - 单步调试 PHP 会改变 MySQL 结果

MySql 子查询作为列和别名