在以下查詢中,您認爲哪種方法更好?你有什麼理由(代碼效率,更好的可維護性,少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