MIN / MAX与ORDER BY和LIMIT


99

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

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

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;

Answers:


125

在最坏的情况下,如果要查看未索引的字段,则使用MIN()需要对表进行一次完整的遍历。使用SORT并且LIMIT需要一个文件排序。如果针对大表运行,则预期的性能可能会存在显着差异。作为无意义的数据点,我的开发服务器上的106,000行表MIN()花了0.36秒SORTLIMIT花了0.84秒。

但是,如果您正在查看索引列,则很难注意到该差异(两种情况下无意义的数据点均为0.00s)。但是,查看一下explain的输出,看起来好像MIN()可以简单地从索引中选取最小值(“ Select table Optimized away”和“ NULL”行),而SORTand LIMIT仍需要对索引进行有序遍历(106,000行)。实际的性能影响可能微不足道。

它看起来像是MIN()要走的路-在最坏的情况下更快,在最好的情况下没有区别,它是标准SQL,并且最清楚地表达了您想要获得的价值。正如mson所述,唯一似乎需要使用SORT和的LIMIT情况是,您正在编写一个通用运算,该运算从任意列中查找前N个值或后N个值,因此不值得写出特殊情况的操作。


7
单次传递的o(n)与排序的0(nlogn)
Abhishek Iyer

1
@AbhishekIyer你是完全正确的,但是我要添加“在最坏的情况下,对于未索引字段”。
dmikam 2015年

关于最糟糕的未索引情况的那部分是错误的。您始终需要进行全面扫描,您又如何知道它是最小还是最大?这并不像您正在扫描并且价值在尖叫:“嘿,您终于找到了我!我是杰克,最大!”。
Robo Robok

在具有4.7亿行的索引表的测试中,两个查询都花费0.00 s。但是,如果我们向查询添加过滤器“ WHERE field2 = x”,则LIMIT的查询仍需0.00 s,而MIN的查询需0.21 s。
安东尼奥·卡纳斯·巴尔加斯

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

仅仅是因为它与ANSI兼容。限制1特定于MySql,因为TOP特定于SQL Server。


大多数DBMS具有限制/偏移量或等效值,并且我使用过的大多数应用程序都使用了它(不是替代MIN,而是用于分页等其他目的。)
finnw 2009年

@finnw-我同意,但发问者的示例正在明确比较极限与最小值。
OtávioDécio

9

MSON肖恩McSomething指出,MIN是优选的。

使用ORDER BY + LIMIT的另一个原因是,如果要获取与MIN列不同的列的值。

例:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

4

我认为答案取决于您在做什么。

如果查询为1,并且意图与您指定的一样简单,则最好选择min(field)。

但是,通常将这些类型的需求更改为-抓取前n个结果,抓取第n个-第m个结果,等等。

我认为提交您选择的数据库并不是一个太糟糕的主意。更改数据库不应该轻易做出,而必须修改此举时要付出的代价。

为什么现在要限制自己,以后可能会也可能不会感到痛苦?

我确实认为最好尽可能地保留ANSI,但这只是一个指导原则...


3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.