表 tbl(uid, username, message, dateline),需按 uid 去重,保留 dateline 最大的一行。
SELECT * FROM tbl
WHERE dateline IN (SELECT MAX(dateline) FROM tbl GROUP BY uid)
ORDER BY dateline DESC;
缺點:IN 子查詢在大數據量下執行計畫退化為全表掃描 + 依賴子查詢,效能極差。
SELECT a.*
FROM tbl a
INNER JOIN (
SELECT MAX(dateline) AS dateline
FROM tbl
GROUP BY uid
) b ON a.dateline = b.dateline
GROUP BY a.id
ORDER BY a.dateline DESC;
優勢:
b 僅含聚合結果,極小,JOIN 走 ref/eq_ref 類型。IN 子查詢的相關執行開銷。建立組合索引 INDEX idx_uid_dt (uid, dateline),派生表聚合可走 Using index,主查詢 JOIN 亦可覆蓋,極致效能。
ROW_NUMBER() OVER (PARTITION BY uid ORDER BY dateline DESC) (MySQL 8.0+ / PostgreSQL / SQL Server) 窗口函數更簡潔。