最小/最大值与订单倍数和限制

在以下查询中,您认为哪种方法更好?您的理由是什么(代码效率、更好的可维护性、更少的 WTFery) ..。

SELECT MIN(`field`)
FROM `tbl`;


SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
67643 次浏览
SELECT MIN(`field`)
FROM `tbl`;

仅仅因为它是 ANSI 兼容的。限制1对于 MySql 是特殊的,就像 TOP 对于 SQLServer 一样。

如果性能可以接受,我会使用第一个,因为它在语义上更接近于意图。
如果性能是一个问题,(大多数现代优化器可能会将两者优化到同一个查询计划,尽管您必须进行测试以验证这一点) ,那么当然我会使用更快的一个。

I think the answers depends on what you are doing.

如果您有一个关闭查询,并且意图和您指定的一样简单,那么选择 min (field)是最好的。

However, it is common to have these types of requirements change into - grab top n results, grab nth - mth results, etc.

我不认为这是一个太可怕的想法,承诺您所选择的数据库。改变 dbs 不应该是轻率的,必须修改是你付出的代价,当你采取这一行动。

Why limit yourself now, for pain you may or may not feel later on?

我确实认为尽可能留在 ANSI 很好,但这只是一个指导方针..。

在最坏的情况下,如果您正在查看一个未索引的字段,那么使用 MIN()需要对表进行一次完整的传递。使用 SORTLIMIT需要文件排序。如果在一个大型表上运行,那么感知到的性能可能会有很大的差异。作为一个轶事数据点,在我的开发服务器上,MIN()用0.36秒,而 SORTLIMIT用0.84秒对抗106,000行表。

但是,如果您正在查看索引列,则很难注意到这种差异(两种情况下,无意义的数据点都是0.00 s)。然而,看解释的输出,似乎 MIN()能够简单地从索引中提取最小的值(“选择已优化的表”和“ NULL”行) ,而 SORTLIMIT仍然需要对索引进行有序遍历(106,000行)。实际的性能影响可能是可以忽略不计的。

看起来 MIN()是最好的选择——它在最坏的情况下更快,在最好的情况下难以区分,是标准的 SQL,并且最清楚地表达了你想要得到的值。唯一看起来需要使用 SORTLIMIT的情况是,正如 新生提到的,您正在编写一个通用操作,从任意列中查找顶部或底部的 N 值,因此不值得编写特殊情况下的操作。

As 新生 and 肖恩 · 麦克什么 have pointed out, MIN is preferable.

ORDERBY + LIMIT 之所以有用的另一个原因是,您希望获取与 MIN 列不同的列的值。

例如:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

User650654表示,当需要“获取与 MIN 列不同的列的值”时,带有 LIMIT 1的 ORDER BY 非常有用。我认为,在这种情况下,使用 MIN 代替排序(希望这是优化的: ())的两次单次传递仍然具有更好的性能

SELECT some_other_field, field
FROM tbl
WHERE field=(SELECT MIN(field) FROM tbl)