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