2009-01-09 59 views
65

在以下查询中,您认为哪种方法更好?你有什么理由(代码效率,更好的可维护性,少WTFery)...最小/最大与ORDER BY和LIMIT

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

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

回答

90

在最坏的情况下,如果你正在寻找一个没有索引的字段,使用MIN()需要一个完整的桌子的通过。使用SORTLIMIT需要一个文件夹。如果对一张大桌子运行,那么在percieved性能上可能会有显着差异。作为一个毫无意义的数据点,MIN()花费了0.36s,而SORTLIMIT花费了0.84s兑换我的开发服务器上的106,000行表。

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

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

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

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

+0

大多数的DBMS具有限/偏移或等同物,并且它是在大多数应用我已在(工作的使用不作为替代MIN,但对于其他的目的,例如分页。 ) – finnw 2009-01-09 01:36:13

+0

@finnw - 我同意,但提问者的例子是明确地比较极限和min。 – 2009-01-09 01:41:05

2

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

3

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

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

然而,常见的有这些类型的需求转变成 - 抢前N个结果,抢第n - m个结果等

我不认为这是太可怕的想法提交到您选择数据库。不应该轻易改变dbs,而必须修改是您在执行此举时所付出的代价。

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

我认为这是很好的ANSI停留尽可能,但是这只是一个指导...

4

由于msonSean McSomething已经指出,MIN是优选的。

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

实施例:

SELECT some_other_field, field 
FROM tbl 
ORDER BY field 
LIMIT 1