MySQL GROUP BY 預設會對分組欄位進行**隱式排序**(舊版本),導致 EXPLAIN 出現 Using filesort。ORDER BY NULL 可顯式禁用此排序,針對「只需聚合、不關心順序」的場景(如報表入庫、統計彙總)顯著提升效能。
GROUP BY col 在 MySQL 5.7 前預設 ORDER BY col。Using filesort,大數據集下 CPU/記憶體開銷大。ORDER BY NULL 告訴優化器:**不需要任何排序**,直接按讀取順序聚合輸出。INSERT INTO report_table (day, clicks, revenue)
SELECT day, COUNT(*), SUM(revenue)
FROM click_origin_table
GROUP BY day
ORDER BY NULL; -- 禁用隱式排序
click_origin_table 按 day 寫入(天然有序)。ORDER BY NULL 後,EXPLAIN 的 Extra 欄不再出現 Using filesort。GROUP BY 不再預設排序,輸出順序不確定。ORDER BY**。ORDER BY NULL 在 8.0 仍合法,語義為「確認無排序需求」,優化器可能選擇更優執行計劃。SELECT * FROM t ORDER BY col ASC; -- NULL 在最前
SELECT * FROM t ORDER BY col DESC; -- NULL 在最後
符合 SQL 標準:NULLS FIRST(ASC)、NULLS LAST(DESC)。MySQL 不支援顯式 NULLS FIRST/LAST 語法,但行為一致。
| 場景 | 建議 |
|---|---|
| 報表彙總入庫、統計快照 | 加 ORDER BY NULL 禁用排序 |
| 前端直接展示、API 返回 | 顯式 ORDER BY col ASC/DESC 保證順序 |
| MySQL 8.0 專案 | 不依賴隱式排序,所有需序處加 ORDER BY |
| 複合索引覆蓋 GROUP BY | 索引順序 = GROUP BY 順序 = ORDER BY 順序,可避免 filesort |
EXPLAIN SELECT day, COUNT(*) FROM click_origin_table GROUP BY day ORDER BY NULL;
-- Extra 應無 Using filesort
ORDER BY NULL 是 MySQL 特有的效能微優化開關,「不需要順序時關掉排序」,在大數據聚合入庫場景能省下可觀 CPU 與臨時表空間。養成「聚合不需序 → 寫 NULL」習慣,效能收益免費拿。