表 member_payment,按 member_id 分組,取每組 id 最大(最新)的一行。
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 關閉時才生效),不可移植。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;
(member_id, id) 極快。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
);
| 寫法 | 執行計劃特徵 | 推薦度 |
|---|---|---|
| 排序 + GROUP BY | filesort + temporary | ⭐ |
| MAX(id) + LEFT JOIN | ref / eq_ref,無臨時表 | ⭐⭐⭐⭐⭐ |
| EXISTS | Semi-Join,無臨時表 | ⭐⭐⭐⭐ |
結論:優先使用「聚合子查詢 + JOIN」模式,並建立 (member_id, id) 聯合索引。