MIN/MAX与ORDER BY和LIMIT

nic*_*ckf 85 mysql sql

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

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

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

Sea*_*ing 114

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

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

它似乎MIN()是要走的路 - 在最坏的情况下更快,在最好的情况下无法区分标准SQL,并且最明确地表达了您想要获得的价值.正如mson所提到的那样,使用SORT并且LIMIT可能需要的唯一情况是,你在编写一个从任意列中找到顶部或底部N值的一般操作,并且不值得写出特殊情况操作.

  • o(n)用于单次传递vs 0(nlogn)用于排序 (6认同)

Otá*_*cio 12

SELECT MIN(`field`)
FROM `tbl`;
Run Code Online (Sandbox Code Playgroud)

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


use*_*654 9

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

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

例:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下这是更好的选择吗?或者使用最大/最小的嵌套查询?(`SELECT some_other_field, field FROM tbl WHERE field = ( SELECT MIN(field) FROM tbl )`) (2认同)

mso*_*son 5

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

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

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

我不认为提交到您选择的数据库是一个太糟糕的想法。更改dbs 不应该掉以轻心,并且必须修改您在执行此操作时所付出的代价。

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

我确实认为尽可能保持 ANSI 是好的,但这只是一个指导方针......