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

MySQL 分組取每組第一條記錄:三種寫法效能對比

     編輯:MySQL 資料庫相關知識

場景

表 member_payment,按 member_id 分組,取每組 id 最大(最新)的一行。

寫法一:先排序再 GROUP BY(不推薦)

SELECT * FROM (
    SELECT * FROM member_payment ORDER BY id DESC
) t GROUP BY member_id LIMIT 10;
  • 缺點:Using temporary; Using filesort,依賴 MySQL 非標準行為(ONLY_FULL_GROUP_BY 關閉時才生效),不可移植。

寫法二:子查詢 + LEFT JOIN(推薦)

SELECT s.*
FROM (
    SELECT MAX(id) AS id FROM member_payment GROUP BY member_id LIMIT 10
) t
LEFT JOIN member_payment s ON t.id = s.id;
  • 先取各組最大 ID,再關聯回主表取完整行。
  • 可用覆蓋索引 (member_id, id) 極快。

寫法三:EXISTS 子查詢

SELECT * FROM member_payment
WHERE EXISTS (
    SELECT id FROM (
        SELECT MAX(id) AS id FROM member_payment GROUP BY member_id LIMIT 10
    ) t WHERE t.id = member_payment.id
);
  • 語意清晰,優化器常轉為 Semi-Join,效能接近寫法二。

效能總結

寫法執行計劃特徵推薦度
排序 + GROUP BYfilesort + temporary⭐
MAX(id) + LEFT JOINref / eq_ref,無臨時表⭐⭐⭐⭐⭐
EXISTSSemi-Join,無臨時表⭐⭐⭐⭐

結論:優先使用「聚合子查詢 + JOIN」模式,並建立 (member_id, id) 聯合索引。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved