聊聊explain查看執(zhí)行計劃
在MySQL性能調(diào)優(yōu)的時候explain是必須要使用的關鍵字,它的作用是可以查看sql語句的執(zhí)行信息,包括表的讀取順序,應用到的索引等信息。
用法:explain + sql語句。
本篇我們先熟悉explain的內(nèi)容,為下篇學習索引奠定基礎。
explain內(nèi)容
查看user全表查詢的執(zhí)行計劃:
- mysql> explain select * from user;
id
id表示select查詢語句的執(zhí)行順序或者是操作表的執(zhí)行順序。
id的值有二種情況:
- id相同,表示執(zhí)行的順序是由上至下
- id不同,id的序號會是遞增的,id的值越大表示優(yōu)先級越高,越先被執(zhí)行。
select_type
select_type表示查詢類型,它的值域為:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT。
- SIMPLE:簡單的查詢,不包含子查詢和UNION。
- PRIMARY:如果查詢的語句中包含了復雜的子查詢,那么最外層的查詢被標記為PRIMARY。
- SUBQUERY:select或者where中的子查詢。
- DERIVED:from列表中的子查詢生成的衍生表查詢。
- UNION:聯(lián)合查詢。
- UNION RESULT:從UNION表獲取結(jié)果的查詢。
table
數(shù)據(jù)行是從哪個表獲取的。
type
表示查詢使用了哪種類型,它的值域:ALL、index、range、ref、eq_ref、const、system。這是我們優(yōu)化時重點關注的一個指標。
從最好到最差排序:
system>const>eq_ref>ref>range>index>ALL。
阿里巴巴SQL優(yōu)化規(guī)范:
- 【推薦】 SQL性能優(yōu)化的目標:至少要達到 range 級別,要求是ref級別,如果可以是const最好。
- 說明:
- 1)const 單表中最多只有一個匹配行(主鍵或者唯一索引),在優(yōu)化階段即可讀取到數(shù)據(jù)。
- 2)ref 指的是使用普通的索引(normal index)。
- 3)range 對索引進行范圍檢索。
system:表中只有一行記錄的查詢,類似系統(tǒng)表。
eq_ref:多表時唯一索引掃描,對于每一個索引,表中只有一行記錄相匹配。
index:索引物理文件全掃描,速度比較慢,比全表掃描性能好一點。
ALL:全表掃描。
possible_keys
可能應用在這個表的索引,可以會一個或者多個,不一定是實際查詢使用的索引。
key
查詢中實際使用的索引,如果為null表示沒有使用索引。
如果是覆蓋索引,則只顯示在key中。
key_len
表示索引字段的最大可能長度,并不是實際的長度,它是根據(jù)表定義得到的,而不是通過表檢索得到的。長度越短越好。
ref
表示索引的哪一列被使用了,可能是個常數(shù)。哪些列或者常量被用于查找索引列上的值。
rows
根據(jù)表的信息和索引使用情況,大致估算的查找到所需的記錄需要掃描的行數(shù)。越小越好。
Extra
擴展信息。
阿里巴巴SQL優(yōu)化規(guī)范:
- 【推薦】利用覆蓋索引來進行查詢操作,避免回表。
- 說明:如果一本書需要知道第11章是什么標題,會翻開第11章對應的那一頁嗎?目錄瀏覽一下就好,這個目錄就是起到覆蓋索引的作用。
- 正例:能夠建立索引的種類分為主鍵索引、唯一索引、普通索引三種,而覆蓋索引只是一種查詢的一種效果,用explain的結(jié)果,extra列會出現(xiàn):using index。
這里提到了覆蓋索引,extra列會出現(xiàn)using index。
extra還有其他比較重要的信息:
using filesort:用到了外部的索引排序,即MySQL無法利用索引完成排序。
using temptory:使用了臨時表。
using where:使用了where過濾。
還有其他幾種,不是經(jīng)常出現(xiàn),我們就不說明了。