MySQL的EXPLAIN指令可以檢視SELECT語句的執行的計劃,是 MySQL 查詢優化的必備工具。通過執行計劃可以了解查詢方式、索引使用情況、需要掃描的資料量以及是否需要臨時表或排序操作等資訊。我們需要分析執行計劃對查詢進行有的放矢的優化。
需要注意:
- EXPLAIN不考慮觸發器、存儲過程或使用者自定義函數對查詢的影響;
- EXPLAIN不考慮緩存;
- EXPLAIN隻能分析執行計劃,不能顯示存儲引擎在執行查詢過程中進行的操作;
- 部分統計資訊是估算的,并非精确值。
這裡以MySQL 5.6版本為基礎舉例說明。
如下SQL語句:
EXPLAIN SELECT * FROM
user
JOIN
post
ON
user
.id =
post
.uid
WHERE user.
created_at
< '2018-10-01 00:00:00' AND
post
.status = 1;
輸出結果:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | user | range | PRIMARY,idx_created_at | idx_created_at | 7 | null | 19440 | Using index condition; Using where; Using temporary; Using filesort |
post | idx_uid,idx_status | idx_uid | 8 | user.id | Using where |
EXPLAIN 的行數為查詢涉及的表數, 結果各列的含義為:
- id: 查詢的唯一辨別
- select_type: 查詢的類型
- table: 查詢的表, 可能是資料庫中的表/視圖,也可能是 FROM 中的子查詢
- type: 搜尋資料的方法
- possible_keys: 可能使用的索引
- key: 最終決定要使用的索引名
- key_len: 查詢索引使用的位元組數。通常越少越好
- ref: 查詢的列或常量
- rows: 需要掃描的行數,估計值。通常越少越好
- extra: 額外的資訊
資料來源:
MySQL 5.7 Reference Manual
https://dev.mysql.com/doc/refman/5.7/en/explain.htmlOptimizing Queries with EXPLAIN
https://dev.mysql.com/doc/refman/5.7/en/using-explain.html