GROUP BY 本質 = 排序 + 分組 + 聚合。與 ORDER BY 同樣可利用索引避免文件排序。MySQL 5.6+ 引入 鬆散索引掃描,僅掃描索引關鍵節點即可完成分組,大幅降低 I/O。
Using index for group-byUsing temporary; Using filesortCREATE TABLE group_message (
id INT PRIMARY KEY AUTO_INCREMENT,
group_id INT,
user_id INT,
gmt_create DATETIME,
...
);
-- 組合索引順序關鍵:分組列在前,聚合列在後
CREATE INDEX idx_gid_uid_gc ON group_message(group_id, user_id, gmt_create);
EXPLAIN
SELECT user_id, MAX(gmt_create)
FROM group_message
WHERE group_id < 10
GROUP BY group_id, user_id;
輸出關鍵行:
type: range
key: idx_gid_uid_gc
Extra: Using where; Using index for group-by
(group_id, user_id, gmt_create) 完美匹配 WHERE + GROUP BY + MAX()group_id, user_id 直接跳躍到每組最後一條記錄(MAX gmt_create),無需掃描組內所有行Using index for group-by 確認走鬆散掃描GROUP BY 列構成索引最左前綴MIN()/MAX(),且作用於索引中緊隨分組列之後的列DISTINCT、無 ORDER BY 衝突SELECT *,只取需求列,增加覆蓋索引命中率