MIN / MAX与ORDER BY和LIMIT

在下面的查询中,你会考虑哪种方法更好? 你有什么理由(代码效率,更好的可维护性,lessWTFery)…

SELECT MIN(`field`) FROM `tbl`; SELECT `field` FROM `tbl` ORDER BY `field` LIMIT 1; 

在最糟糕的情况下,在查看未索引字段的地方,使用MIN()需要对表进行一次完整传递。 使用SORTLIMIT需要一个文件夹。 如果对一张大桌子运行,那么在percieved的performance可能会有显着的差异。 作为一个毫无意义的数据点, MIN()花费了0.36s,而SORTLIMIT花费了0.84s,而我的dev服务器上的106,000行表格花费了0.84s。

但是,如果您正在查看索引列,则差异更难以察觉(两种情况下无意义数据点均为0.00s)。 看看explain的输出,看起来像MIN()能够简单地从索引中取出最小值('Select tables optimized'和'NULL'rows),而SORTLIMIT仍然需要做一个命令遍历索引(106,000行)。 实际的性能影响可能可以忽略不计。

看起来像MIN()是要走的路 – 在最糟糕的情况下,速度更快,在最好的情况下难以区分,是标准的SQL,并且最清楚地expression了您试图获得的值。 唯一的情况下,似乎使用SORTLIMIT将是可取的,就像正如所提到的那样,您正在编写一个通用操作,它可以从任意列中查找最高或最低的N值,而且不值得写出特例操作。

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

只是因为它是ANSI兼容的。 限制1对于MySql是特定的,因为TOP对于SQL Server是特定的。

正如Mson和Sean McSomething所指出的,MIN是可取的。

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

例:

 SELECT some_other_field, field FROM tbl ORDER BY field LIMIT 1 

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

如果您有一个closures查询,并且意图与您指定的一样简单,请selectmin(field)。

然而,将这些types的要求变为 – 抓取前n个结果,抓取第n个结果等是很常见的。

我不认为对你select的数据库做出承诺是太可怕了。 改变dbs不应该变得轻松,而且必须修改是你做这个行动时所支付的价格。

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

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

给定可接受的性能,我会使用第一个,因为它在语义上更接近意图。
如果性能是一个问题,(大多数现代优化器都会优化两个查询计划,尽pipe你必须testing来validation),那么我当然会用更快的。