MySQL的EXPLAIN命令是分析SELECT語句執行計劃的核心工具。雖然原生僅支持SELECT,但通過將UPDATE/DELETE的WHERE條件轉換為等效SELECT,同樣可洞察索引使用情況。配合EXTENDED關鍵字與SHOW WARNINGS,更能獲取優化器重寫後的查詢信息。
mk-visual-explain將傳統表格輸出轉為樹形結構,直觀展示連接順序、訪問類型等關鍵信息:
# 文件輸入模式
mk-visual-explain < explain_output.txt
# 直接解析SQL文件
mk-visual-explain -c query.sql
# 管道流式處理
mysql -e "EXPLAIN SELECT * FROM user" | mk-visual-explain
# 交互模式設置pager
mysql> PAGER mk-visual-explain
mysql> EXPLAIN SELECT ...
CREATE TABLE article (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
author_id INT UNSIGNED,
category_id INT UNSIGNED,
views INT UNSIGNED,
comments INT UNSIGNED,
title VARBINARY(255),
content TEXT
);
查詢目標:獲取category_id=1且comments>1條件下views最大的author_id。
| 索引策略 | EXPLAIN關鍵輸出 | 性能瓶頸 |
|---|---|---|
| 無索引 | type: ALL, key: NULL, Extra: Using where; Using filesort |
全表掃描+文件排序 |
複合索引 (category_id, comments, views) |
type: range, key: x, Extra: Using where; Using filesort |
范圍查詢導致views索引失效,仍需文件排序 |
複合索引 (category_id, views) |
優化器錯誤選擇舊索引x |
統計信息偏差導致優化器誤判 |
強制使用索引y FORCE INDEX(y) |
type: ref, key: y, Extra: Using where |
✅ 消除文件排序,最優執行計劃 |
複合索引(a,b,c)按a→b→c順序構建B+樹。當b列出現范圍查詢(>、<、LIKE '%...')時,c列索引失效,因為樹結構無法在b的離散值範圍內保證c的有序性。此案例中comments > 1導致views排序無法下推,產生Using filesort。
WHERE等值條件列優先,ORDER BY列緊隨其後,范圍查詢列最後或不入索引FORCE INDEX干預優化器:統計信息過舊或數據分布特殊時有效ANALYZE TABLE更新統計信息:避免優化器因誤估行數選擇次優計劃掌握EXPLAIN輸出中type、key、Extra三大核心欄位含義,結合索引底層原理,即可系統性解決80%以上的慢查詢問題。