一個(gè)常見的理解錯(cuò)誤:mysql在執(zhí)行explain時(shí)不會執(zhí)行sql語句,事實(shí)上如果查詢的from字段有子查詢,explain會執(zhí)行子查詢.
explain只能解釋select查詢,對update,delete,insert需要重寫為select.
下面就explain的各個(gè)字段分別解釋.
1.id
當(dāng)sql語句中有子查詢和關(guān)聯(lián)查詢時(shí)會顯示多列,id用于標(biāo)志多列數(shù)據(jù).
2.select_type
用于表示是簡單還是復(fù)雜的查詢,不包括子查詢和union的查詢?yōu)楹唵尾樵?如果查詢中有任何復(fù)雜的部分,外層查詢標(biāo)記為primary,復(fù)雜查詢分為四大類(SUBQUERY,DERIVED,UNION,UNION RESULT)
(1)SUBQUERY:包含在select列表中的子查詢中的select,不在from子句中的select
(2)DERIVED:表示包含在from子句中的select,mysql會遞歸的執(zhí)行并將結(jié)果放在一個(gè)臨時(shí)表中,服務(wù)器內(nèi)部稱其為“派生表”
(3)UNION:在union中第二個(gè)和隨后的select被標(biāo)記為union。
(4)UNION RESULT:用來在UNION產(chǎn)生的匿名臨時(shí)表檢索結(jié)果的select被標(biāo)記為union result
綜上,select_type共有SIMPLE,PRIMARY,SUBQUERY,DERIVED,UNION,UNION RESULT 六種常見情況。
3.table
一般情況下為表名,當(dāng)from子句中有子查詢或者union時(shí),table列會變得復(fù)雜的多,在這種情況下,mysql會創(chuàng)建匿名的臨時(shí)表,這種情況下,table列為**derived N**的形式,其中N時(shí)子查詢的id.
當(dāng)有UNION時(shí),UNION RESULT的table列包含一個(gè)參與UNION的id列表,形為**union1,3**
4.type
訪問類型mysql決定如何查找表中的行,從最差到最優(yōu)依次如下:
(1)ALL:全表掃描,通常意味著mysql必須掃描整張表,從頭到尾去找到所需要的行.
(2)index:這和全表掃描一樣,只是mysql在掃描表示按索引次序進(jìn)行而不是行,他的主要優(yōu)點(diǎn)是避免了排序,最大的缺點(diǎn)是承擔(dān)按索引次數(shù)讀取整張表的開銷,如果Extra字段看到Using index,說明Mysql正在使用覆蓋索引,他比按索引次序全表掃描開銷要少得多.
(3)range:范圍掃描就是一個(gè)有限制的索引掃描,它開始于索引的某一點(diǎn),返回匹配這個(gè)值域的行。這比全索引掃描要好一些,因?yàn)樗貌恢闅v全部索引。顯而易見的范圍掃描時(shí)帶有between或者where>,當(dāng)mysql使用索引去查找in()和or時(shí)也會顯示range。但是這兩者在性能上有很重要的差異。
(4)ref:這是一種索引訪問(索引查找),它返回所有匹配某個(gè)單個(gè)值得行,然而它可能找到多個(gè)符合條件的行,因此它是查找和掃描的混合體,此類索引的掃描只有在使用非唯一索引或者唯一索引的非唯一前綴時(shí)才發(fā)生.
(5)eq_ref:使用這種索引查找,mysql最多只返回一條記錄,這種訪問方法在使用mysql主鍵或者唯一索引查找時(shí)看到,它會將他們與某個(gè)參考值作比較.
(6)const,system 當(dāng)mysql能夠從某部分進(jìn)行優(yōu)化將其轉(zhuǎn)換為一個(gè)常量時(shí),它就會使用這些訪問類型,比如如下查詢:explain select id from mis_audit_comment where id = 1/G;
(7)NULL 這種訪問方式意味著Mysql能在優(yōu)化階段分解查詢語句,在執(zhí)行階段甚至用不著訪問表和索引.
5.possible_key
顯示查詢可以使用的索引.
6.key
顯示mysql決定使用哪個(gè)索引來優(yōu)化對表的訪問。
7.key_len
mysql在索引里使用的字節(jié)數(shù),可以根據(jù)key_len計(jì)算出該索引正在使用哪些列,可以根據(jù)key_len查看sql語句使用聯(lián)合索引的情況,當(dāng)有多列索引(audit_status,status,create_time)時(shí),key_len為2時(shí),表示只用了第一個(gè)為small int的索引.
8.ref
顯示table在key中選取的索引中查找值所用的列或者常量.
9.row
mysql估計(jì)為了找到所需的行而要讀取的行數(shù),是mysql認(rèn)為它要檢查的行數(shù),而不是結(jié)果集里的行數(shù).
10.Extra
記錄了不適合在其他列中顯示的額外信息.
(1)Using index:mysql將使用覆蓋索引,以避免訪問表.
(2)Using where:mysql服務(wù)器將在存儲引擎檢索行后再進(jìn)行過濾.
(3)Using temporary:mysql在對結(jié)果排序時(shí)使用了臨時(shí)表.
(4)Using filesort:表示mysql使用一個(gè)外部索引排序,而不是按索引的順序讀取表.
新聞熱點(diǎn)
疑難解答
圖片精選