2009-01-09 57 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