首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询响应时间在哪里和有

问查询响应时间在哪里和有
EN

Stack Overflow用户
提问于 2013-09-30 10:30:33
回答 1查看 509关注 0票数 0

我有一个简单的SQL请求:

代码语言:javascript
复制
SELECT id, title, resum
FROM film
WHERE id = 56 ;

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

但是,使用有子句的相同查询:

代码语言:javascript
复制
SELECT id, title, resum
FROM film
HAVING id =56 ;

给如此大的响应时间,与第一次请求(0.0049秒)。

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

诚挚的问候。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-30 11:17:00

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

代码语言:javascript
复制
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';

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

代码语言:javascript
复制
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将告诉您它不使用索引:

代码语言:javascript
复制
EXPLAIN SELECT id, title, resum FROM film HAVING id =56;

例如,下面是EXPLAIN对我表上的查询的结果:

代码语言:javascript
复制
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行(全部)。

代码语言:javascript
复制
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告诉我们,它使用“主”索引,因此它只需读取一行,就可以得到更快的响应。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19091928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档