SQL 語句前面使用 EXPLAIN
關鍵字:
EXPLAIN SELECT * FROM users WHERE id = 1;
字段 | 含義 |
| 查詢的序號(如果是子查詢或聯合查詢,會有多個 |
| 查詢的類型(簡單查詢、子查詢、聯合查詢等)。 |
| 查詢涉及的表名。 |
| 查詢時使用的分區(如果表有分區)。 |
| 查詢的訪問類型(性能從高到低: |
| 可能使用的索引。 |
| 實際使用的索引。 |
| 使用的索引長度。 |
| 使用的索引與哪些列或常量進行比較。 |
| 估算的掃描行數。 |
| 計算結果集占掃描行數的百分比(MySQL 5.7+)。 |
| 額外信息(如 |
EXPLAIN 的關鍵字段詳解
type:表示 MySQL 如何訪問數據,性能從高到低排序。
system
:表中只有一行數據(系統表)。const
:通過主鍵或唯一索引查詢,結果只有一行。eq_ref
:在連接查詢中,主鍵或唯一索引被使用,返回最多一行。ref
:使用非唯一索引查詢,返回匹配的多行。range
:使用索引進行范圍查詢(如BETWEEN
、IN
)。index
:全索引掃描(比全表掃描快,但仍需遍歷索引)。ALL
:全表掃描(性能最差)。
Extra:提供查詢的額外信息
Using where
:查詢使用了WHERE
條件。Using index
:使用了覆蓋索引(無需回表)。Using temporary
:使用了臨時表(常見于排序或分組)。Using filesort
:使用了文件排序(性能較低)。Using join buffer
:使用了連接緩存(多表連接時)。
如何分析 EXPLAIN 結果
通過 EXPLAIN
結果,可以優化查詢:
1.檢查 type
:
- 目標是使用
const
、eq_ref
、ref
或range
。 - 避免
ALL
(全表掃描)。
2.檢查 key
:
-
- 確保查詢使用了索引。
- 如果沒有使用索引,考慮添加合適的索引。
3.檢查 rows
:
- 估算的掃描行數越少越好。
- 如果行數過多,優化查詢條件或索引。
4.檢查 Extra
:
- 避免
Using temporary
和Using filesort
。 - 盡量使用
Using index
。
水平有限,如有錯誤,歡迎指正!