表 my_tbl(a, b, c),需查每個 a 值下 b 最小的那行完整記錄。
-- 數據樣例 a | b | c 1 | 3 | 'cd' 2 | 3 | 'nhd' 1 | 5 | 'bg' 2 | 6 | 'cds' 1 | 7 | 'kiy' 3 | 7 | 'vsd' 3 | 8 | 'ndf' -- 期望結果 a | b | c 1 | 3 | 'cd' 2 | 3 | 'nhd' 3 | 7 | 'vsd'
SELECT A.* FROM my_tbl AS A WHERE A.b = (SELECT MIN(b) FROM my_tbl AS B WHERE B.a = A.a);
EXPLAIN 顯示 DEPENDENT SUBQUERYSELECT a, b, c, COUNT(a)
FROM (
SELECT a, b, c FROM my_tbl GROUP BY a, b
) AS A
GROUP BY a;
GROUP BY a, b 產生去重後的 (a,b,c) 組合GROUP BY a 取每組第一行(MySQL 允許非聚合列任意取值,恰好是最小 b 對應的 c)| 維度 | 關聯子查詢 | GROUP BY 方案 |
|---|---|---|
| 執行模式 | 逐行驅動(Nested Loop) | 集合運算(Hash/Stream Aggregate) |
| 索引利用 | 被動查找 | 主動掃描+分組 |
| 臨時表 | 無 | 可能用到(但極快) |
| 適用數據量 | 極小(<1萬) | 百萬級無壓力 |
SELECT a, b, c FROM (
SELECT a, b, c, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b) AS rn
FROM my_tbl
) t WHERE rn = 1;
DEPENDENT SUBQUERY = 高風險,SIMPLE/DERIVED = 相對安全**SQL 寫法決定執行策略,策略決定性能數量級差異**。將「逐行驅動」轉化為「集合運算」,是 SQL 優化的核心思維。養成 **寫完子查詢必看 EXPLAIN** 的習慣,讓性能問題止於開發階段。