實測對比 DISTINCT 與 GROUP BY 在去重、排序、聚合、LIMIT 行為上的異同,並給出效能選擇建議。
DISTINCT 保持資料存放順序;GROUP BY 隱式排序(通常 ASC)。DISTINCT ≈ GROUP BY + 取每組第一行,底層均可用鬆散/緊湊索引掃描或臨時表。DISTINCT 僅找不同值;GROUP BY 需為聚合函數準備。但 GROUP BY 讀取行數 = 分組數,往往遠小於總行數,**實測 GROUP BY 通常更快**。CREATE TABLE student (name VARCHAR(20), age INT, height INT);
INSERT INTO student VALUES ('a',5,123),('a',5,456),('b',20,222);
SELECT DISTINCT name, age FROM student; -- 僅 (a,5) (b,20)
SELECT name, age, SUM(height) FROM student GROUP BY name, age; -- (a,5,579) (b,20,222)
SELECT name, age, SUM(height) AS n FROM student GROUP BY name, age HAVING n > 500;
SELECT songname, sengerid, COUNT(*) AS n FROM t_song GROUP BY songname, sengerid HAVING n > 1 ORDER BY n DESC, songid ASC LIMIT 10;
驗證:LIMIT 截取的是聚合排序後的結果集,非分組前行數。
SELECT COUNT(DISTINCT(songid)) FROM feedback; SELECT COUNT(DISTINCT songid) FROM feedback;
SELECT feedback_id, songid, songname, MAX(singername), MAX(time) AS new_time FROM feedback GROUP BY songid ORDER BY new_time DESC;
WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
帶 GROUP BY 查詢改寫 SELECT COUNT(*) FROM ... GROUP BY ... 會因欄位不匹配報錯(如 ORDER BY new_time 找不到別名)。