MIN / MAX与ORDER BY和LIMIT

时间:2009-01-09 01:25:10

标签: sql mysql

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

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

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

6 个答案:

答案 0 :(得分:110)

在最糟糕的情况下,如果您正在查看未编入索引的字段,则使用MIN()需要对表进行一次完整传递。使用SORTLIMIT需要一个文件排序。如果针对大型桌面运行,则可能会在性能方面存在显着差异。作为一个毫无意义的数据点,MIN()占用.36s而SORTLIMIT占用.84s,而我的开发服务器上的106,000行表。

但是,如果您正在查看索引列,则难以注意到差异(两种情况下无意义的数据点均为0.00秒)。但是,查看explain的输出,看起来MIN()能够简单地从索引中选取最小值('Select tables optimized away'和'NULL'行),而SORT和{ {1}}仍然需要对索引进行有序遍历(106,000行)。实际的性能影响可能微乎其微。

看起来LIMIT是可行的方式 - 在最坏的情况下更快,在最好的情况下难以区分,是标准SQL,并且最明确地表达了您想要获得的价值。唯一似乎使用MIN()SORT的情况是,如mson所述,您将编写一个通用操作,从中查找顶部或底部N值任意列,并不值得写出特殊情况操作。

答案 1 :(得分:11)

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

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

答案 2 :(得分:7)

正如msonSean McSomething指出的那样,MIN更可取。

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

示例:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

答案 3 :(得分:3)

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

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

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

我认为提交所选数据库的想法并不太可怕。不应轻易改变dbs,并且必须修改是你移动时支付的价格。

为什么现在限制自己,因为你以后可能会或可能不会感到疼痛?

我认为尽可能保持ANSI是件好事,但这只是一个指导原则......

答案 4 :(得分:2)

考虑到可接受的性能,我会使用第一个,因为它在语义上更接近意图 如果性能是一个问题,(大多数现代优化器都会按照同样的查询计划进行优化,尽管你必须进行测试来验证),当然我会使用更快的。

答案 5 :(得分:0)

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

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