3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
它們本質(zhì)上是相互對(duì)應(yīng)的(實(shí)際上這是一些數(shù)據(jù)庫(kù)DISTINCT
在引擎蓋下實(shí)現(xiàn)的方式)。
如果其中一個(gè)更快,那就是DISTINCT
。這是因?yàn)椋m然兩者是相同的,但查詢(xún)優(yōu)化器必須抓住這樣一個(gè)事實(shí):你GROUP BY
沒(méi)有利用任何組成員,只有他們的密鑰。DISTINCT
使這個(gè)顯而易見(jiàn),所以你可以使用稍微笨拙的優(yōu)化器。
如有疑問(wèn),請(qǐng)測(cè)試!

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您有索引profession
,則這兩個(gè)是同義詞。
如果你不這樣做,那就用吧DISTINCT
。
GROUP BY
在MySQL
各種結(jié)果。你甚至可以這樣做:
SELECT u.profession FROM users u GROUP BY u.profession DESC
讓你的職業(yè)按DESC
順序排序。
DISTINCT
創(chuàng)建一個(gè)臨時(shí)表并使用它來(lái)存儲(chǔ)重復(fù)項(xiàng)。GROUP BY
做同樣的事情,但事后對(duì)不同的結(jié)果進(jìn)行排序。
所以
SELECT DISTINCT u.profession FROM users u
如果您沒(méi)有索引,則更快profession
。

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
上面的所有答案都是正確的,對(duì)于單列上的DISTINCT與單列上的GROUP BY的情況。每個(gè)數(shù)據(jù)庫(kù)引擎都有自己的實(shí)現(xiàn)和優(yōu)化,如果你關(guān)心的差別很?。ㄔ诖蠖鄶?shù)情況下),那么你必須針對(duì)特定的服務(wù)器和特定版本進(jìn)行測(cè)試!隨著實(shí)施可能會(huì)改變......
但是,如果您在查詢(xún)中選擇了多個(gè)列,那么DISTINCT本質(zhì)上是不同的!因?yàn)樵谶@種情況下,它將比較所有行的所有列,而不是僅比較一列。
所以如果你有類(lèi)似的東西:
// This will NOT return unique by [id], but unique by (id,name)SELECT DISTINCT id, name FROM some_query_with_joins// This will select unique by [id].SELECT id, name FROM some_query_with_joins GROUP BY id
認(rèn)為DISTINCT關(guān)鍵字按行指定的第一列來(lái)區(qū)分行是一個(gè)常見(jiàn)的錯(cuò)誤,但DISTINCT是這種方式的通用關(guān)鍵字。
因此,人們必須小心,不要將上述答案視為所有情況的正確答案......您可能會(huì)感到困惑并得到錯(cuò)誤的結(jié)果,而您想要的只是優(yōu)化!
添加回答
舉報(bào)