mysql explain中的type列含义和extra列的含义
很多朋友在用mysql進(jìn)行調(diào)優(yōu)的時(shí)候都肯定會(huì)用到explain來(lái)看select語(yǔ)句的執(zhí)行情況,這里簡(jiǎn)單介紹結(jié)果中兩個(gè)列的含義。
1 type列
官方的說(shuō)法,說(shuō)這列表示的是“訪問(wèn)類型”,更通俗一點(diǎn)就是:mysql找到需要的數(shù)據(jù)行的方式。一下就是從效率最差到最好順序分別介紹下:
All 這個(gè)就是所謂的全表掃描,沒(méi)有用到任何的index,mysql就是從頭到尾把整個(gè)表遍歷一邊,找到所需要的數(shù)據(jù)行。效率是最差的。如下圖,這個(gè)表中的usertype不是索引,這個(gè)查詢中沒(méi)有用到任何索引,所以就出現(xiàn)了全表掃描的結(jié)果。
?
index type列中出現(xiàn)了index,含義僅僅是局限在掃描全表的順序是按照索引順序掃描的,僅僅是按索引順序去掃描的。它的有點(diǎn)是避免了排序,因?yàn)樗饕褪且呀?jīng)排序好的,缺點(diǎn)就是要承擔(dān)按照索引次序讀取整張表的開(kāi)銷。如下,這個(gè)查詢中order by id,id是這個(gè)表的索引,但是因?yàn)闆](méi)有在where中出現(xiàn)任何的索引列,所以它也只是索引順去掃描了全表。(這里強(qiáng)調(diào)一下,你的查詢語(yǔ)句中where條件中沒(méi)有索引,只是order by 的時(shí)候用了index,而且沒(méi)有用limit限制,type這里顯示的是all,也就是這種情況下沒(méi)有l(wèi)imit,還是掃面全表的)
?
range 這個(gè)一般就是在你的where語(yǔ)句中出現(xiàn)了between或者“>”這種符號(hào)的時(shí)候會(huì)出現(xiàn)這個(gè)。這種范圍掃描索引掃描比全表掃描要好,因?yàn)樗恍枰_(kāi)始于索引的某一點(diǎn),而結(jié)束語(yǔ)另一點(diǎn),不用掃描全部索引。
ref 這也是一種索引訪問(wèn),它返回所有匹配某個(gè)單獨(dú)值的行,然而,它可能會(huì)找到多個(gè)符合條件的行,所以他應(yīng)該屬于查找和掃描的混合體。
const,system 當(dāng)mysql能對(duì)查詢的部分就行優(yōu)化,并且轉(zhuǎn)換成一個(gè)常量的時(shí)候,它就會(huì)使用這種訪問(wèn)類型了。比如你把一行的主鍵當(dāng)做where條件放進(jìn)去,那mysql就可以把它轉(zhuǎn)換成一個(gè)常量,然后查詢。如下圖:uid是主鍵,作為where條件就能出現(xiàn)這個(gè)效率最高的查詢結(jié)果。
?
2 extra列
extra列中出現(xiàn)的信息一般不是太重要,但是還是有很多信息我們可以從這里面獲取到:
using index:出現(xiàn)這個(gè)說(shuō)明mysql使用了覆蓋索引,避免訪問(wèn)了表的數(shù)據(jù)行,效率不錯(cuò)!
using where:這說(shuō)明服務(wù)器在存儲(chǔ)引擎收到行后將進(jìn)行過(guò)濾。有些where中的條件會(huì)有屬于索引的列,當(dāng)它讀取使用索引的時(shí)候,就會(huì)被過(guò)濾,所以會(huì)出現(xiàn)有些where語(yǔ)句并沒(méi)有在extra列中出現(xiàn)using where這么一個(gè)說(shuō)明。
using temporary:這意味著mysql對(duì)查詢結(jié)果進(jìn)行排序的時(shí)候使用了一張臨時(shí)表。
using filesort:這個(gè)說(shuō)明mysql會(huì)對(duì)數(shù)據(jù)使用一個(gè)外部的索引排序,而不是按照表內(nèi)的索引順序進(jìn)行讀取。
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的mysql explain中的type列含义和extra列的含义的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: There is no Action m
- 下一篇: mysql开启慢查询