explain執行計划中的字段以及含義在下面的博客中有詳細講述:
https://blog.csdn.net/da_guo_li/article/details/79008016
執行計划能告訴我們什么?
EXPLAIN命令是查看查詢優化器如何決定執行查詢的主要的方法,學會解釋EXPLAIN將幫助我們了解SQL優化器是如何工作的。執行計划可以告訴我們SQL如何使用索引,連接查詢的執行順序,查詢的數據行數。
下面是一個簡單EXPLAIN的結果:
執行計划重點關注 type、key、key_len、rows、extra
type:type如果為ALL,表示全盤掃描,也是效率最低的
key:表示使用了哪個索引,如果沒有使用為null
key_len:表示索引字段的最大可能長度,KEY_LEN的長度由字段定義計算而來,並非數據的實際長度,長度越小,效率越高。
主要是看復合索引用到了哪些列 因為很多復合索引可能只是用到了一列或者某幾列,聯合索引是從左往右來的,算到什么地方,就代表用哪一列
假如有一個表 id int not null ,name varchar(32) not null 並且是utf8字符類型的表 假如索引是id_name 如果只用到id列那么key_len 就是4 如果兩列
都用到了那 key_len 就是 4+32*3+2 如果不是not null 就是4+1+32*3+2+1了
rows:表示MySQL通過哪些列或常量被用於查找索引列上的值,ROWS值的大小是個統計抽樣結果,並不十分准確。全盤掃描時,值最大,接近表中數據行數。建議值小於5000
extra:如果出現using filesort 表示sql中有排序。應盡量避免在磁盤中排序。讓其盡量通過索引字段排序。
以下是執行計划中的字段的詳細解釋:
原文出處:
https://blog.csdn.net/da_guo_li/article/details/79008016
分析執行計划中EXPLAIN的列
ID列
是一位數字,表示執行SELECT語句的順序。
id值相同執行順序從上到下。
id值不同時id值大的先執行。SELECT_TYPE這一列顯示了對應行是簡單還是復雜SELECT.取值如下:SIMPLE值意味着查詢不包括子查詢和UNION。查詢有任何復雜的子部分,則最外層標記為PRIMARY.取值如下:![]()
TABLE
輸出數據行所在的表的名稱
![]()
PARTITIONS
對於分區表,顯示查詢的分區ID,對於非分區表,顯示為NULL
TYPE
EXTRA
![]()
POSSIBLE_KEYS
指出MySQL能使用哪些索引來優化查詢,查詢所涉及的列上的索引都會被列出,但不一定會被使用
KEY
查詢優化器優化查詢實際所使用的索引,如果沒有可用的索引,則顯示為NULL,如查詢使用了覆蓋索引,則該索引僅出現在Key列中
KEY_LEN
表示索引字段的最大可能長度,KEY_LEN的長度由字段定義計算而來,並非數據的實際長度
REF
表示哪些列或常量被用於查找索引列上的值
ROWS
表示MySQL通過哪些列或常量被用於查找索引列上的值,ROWS值的大小是個統計抽樣結果,並不十分准確
Filtered
表示返回結果的行數占需讀取行數的百分比,Filter列的值越大越
無法展示存儲過程,觸發器,UDF對查詢的影響無法使用EXPLAIN對存儲過程進行分析
早期版本的MySQL只支持對SELECT語句進行分析,如果想要分析UPDATE,INSERT語句需要將它們通過某種手段轉換成SELECT語句。
具體sql優化推薦案例:
http://www.cnblogs.com/tangyanbo/p/4462734.html#!comments