在以下查询中,您认为哪种方法更好?你有什么理由(代码效率,更好的可维护性,少WTFery)...最小/最大与ORDER BY和LIMIT
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
在以下查询中,您认为哪种方法更好?你有什么理由(代码效率,更好的可维护性,少WTFery)...最小/最大与ORDER BY和LIMIT
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
在最坏的情况下,如果你正在寻找一个没有索引的字段,使用MIN()
需要一个完整的桌子的通过。使用SORT
和LIMIT
需要一个文件夹。如果对一张大桌子运行,那么在percieved性能上可能会有显着差异。作为一个毫无意义的数据点,MIN()
花费了0.36s,而SORT
和LIMIT
花费了0.84s兑换我的开发服务器上的106,000行表。
但是,如果您正在查看索引列,则差异很难发现(两种情况下无意义的数据点均为0.00s)。然而,看看解释的输出,看起来MIN()
能够简单地从索引中取出最小值('Select tables optimized away'和'NULL'rows),而SORT
和LIMIT
仍然需要执行有序遍历的指数(106,000行)。实际的性能影响可能可以忽略不计。
它看起来像MIN()
是最好的方式 - 它在最糟糕的情况下更快,在最好的情况下无法区分标准SQL,并且最清楚地表达了您试图获得的值。唯一的情况下,似乎使用SORT
和LIMIT
将是可取的,就像mson提到的那样,您正在编写一个通用操作,它可以从任意列中查找最高或最低N值,并且不值得写出特例操作。
SELECT MIN(`field`)
FROM `tbl`;
很简单,因为它是ANSI兼容。限制1对于MySql是特定的,因为TOP对于SQL Server是特定的。
给定可接受的性能我会使用第一个,因为它在语义上更接近意图。
如果性能是一个问题,(大多数现代优化器都会优化两个查询计划,尽管您必须进行测试来验证),那么当然我会使用更快的。
我认为答案取决于你在做什么。
如果您有1次关闭查询并且意图与您指定的一样简单,请选择min(field)。
然而,常见的有这些类型的需求转变成 - 抢前N个结果,抢第n - m个结果等
我不认为这是太可怕的想法提交到您选择数据库。不应该轻易改变dbs,而必须修改是您在执行此举时所付出的代价。
为什么现在要限制自己,因为你以后可能感觉到或可能不会感觉到疼痛?
我认为这是很好的ANSI停留尽可能,但是这只是一个指导...
由于mson和Sean McSomething已经指出,MIN是优选的。
其中ORDER BY + LIMIT有用的另一个原因是如果您想要获取与MIN列不同的列的值。
实施例:
SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
大多数的DBMS具有限/偏移或等同物,并且它是在大多数应用我已在(工作的使用不作为替代MIN,但对于其他的目的,例如分页。 ) – finnw 2009-01-09 01:36:13
@finnw - 我同意,但提问者的例子是明确地比较极限和min。 – 2009-01-09 01:41:05