天天看點

資料庫必知詞彙:MySQL查詢執行計劃(Explain)

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.html

Optimizing Queries with EXPLAIN

https://dev.mysql.com/doc/refman/5.7/en/using-explain.html