首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 去重技巧:用 INNER JOIN + 子查詢高效獲取各分組最新記錄

     編輯:MySQL 資料庫相關知識

場景:按用戶分組取最新一條記錄

表 tbl(uid, username, message, dateline),需按 uid 去重,保留 dateline 最大的一行。

低效寫法:IN 子查詢

SELECT * FROM tbl
WHERE dateline IN (SELECT MAX(dateline) FROM tbl GROUP BY uid)
ORDER BY dateline DESC;

缺點:IN 子查詢在大數據量下執行計畫退化為全表掃描 + 依賴子查詢,效能極差。

高效寫法:INNER JOIN 派生表

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 子查詢的相關執行開銷。
  • 實測大表場景快 6 倍以上。

進階優化:覆蓋索引支援

建立組合索引 INDEX idx_uid_dt (uid, dateline),派生表聚合可走 Using index,主查詢 JOIN 亦可覆蓋,極致效能。

適用場景擴展

  • 最新評論/留言/訂單/日誌各用戶/設備/會話 Top-1。
  • 配合 ROW_NUMBER() OVER (PARTITION BY uid ORDER BY dateline DESC) (MySQL 8.0+ / PostgreSQL / SQL Server) 窗口函數更簡潔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved