首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么选择*要比选择foo快?

为什么选择*要比选择foo快?
EN

Database Administration用户
提问于 2014-07-27 11:11:26
回答 2查看 4.2K关注 0票数 29

考虑一个值和散列表,如下所示:

代码语言:javascript
复制
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| val        | char(9)  | NO   |     | NULL    |                |
| val_hashed | char(50) | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+

以下查询在0.00秒内完成:

代码语言:javascript
复制
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;

但是,这个查询需要3分17秒:

代码语言:javascript
复制
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;

我看到,当查询运行时,进程列表将其显示为状态Sorting result。这种情况是完全可以重复的。注意,还有另一个进程在表上连续执行INSERT操作。

为什么更具体的查询要比*查询运行更长的时间?我一直认为,出于性能原因,应该避免*查询。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2014-07-27 11:40:00

短语ORDER BY 1指的是不同的列;在第一个列中是id,在第二个val中。因为id是关键,所以它将被索引,而order by将是一个微不足道的工作量。然而,对于order by val,系统必须检索每一行,按val对完整的表进行排序,然后只选择其中的一行。

将这两个查询更改为order by id,我认为您的执行时间几乎是相同的。

票数 34
EN

Database Administration用户

发布于 2014-07-28 11:33:55

MG很好地解释了查询中的性能差异。我要谈的是:

我一直认为,出于性能原因,应该避免*查询。

select *本身并没有特别的惩罚,滥用它是有问题的。在单表查询中,它工作得很好。现在,用20列将该表连接到另一个表,然后将联接添加到其他5个表中,每个表都有多个列。现在这是个问题。在没有解释原因的情况下,教授广义的绷带“永不做X”的人也是如此。

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

https://dba.stackexchange.com/questions/72493

复制
相关文章

相似问题

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