考虑一个值和散列表,如下所示:
+------------+----------+------+-----+---------+----------------+
| 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秒内完成:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;但是,这个查询需要3分17秒:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;我看到,当查询运行时,进程列表将其显示为状态Sorting result。这种情况是完全可以重复的。注意,还有另一个进程在表上连续执行INSERT操作。
为什么更具体的查询要比*查询运行更长的时间?我一直认为,出于性能原因,应该避免*查询。
发布于 2014-07-27 11:40:00
短语ORDER BY 1指的是不同的列;在第一个列中是id,在第二个val中。因为id是关键,所以它将被索引,而order by将是一个微不足道的工作量。然而,对于order by val,系统必须检索每一行,按val对完整的表进行排序,然后只选择其中的一行。
将这两个查询更改为order by id,我认为您的执行时间几乎是相同的。
发布于 2014-07-28 11:33:55
MG很好地解释了查询中的性能差异。我要谈的是:
我一直认为,出于性能原因,应该避免*查询。
select *本身并没有特别的惩罚,滥用它是有问题的。在单表查询中,它工作得很好。现在,用20列将该表连接到另一个表,然后将联接添加到其他5个表中,每个表都有多个列。现在这是个问题。在没有解释原因的情况下,教授广义的绷带“永不做X”的人也是如此。
https://dba.stackexchange.com/questions/72493
复制相似问题