前言
本文旨在用最通俗的語(yǔ)言講述最枯燥的基本知識(shí)
這個(gè)話(huà)題比較有意思。昨天中午吃完飯間突然有個(gè)同事蹦出了一句:“l(fā)ike有索引嗎?”,我順口就說(shuō)沒(méi)有,另一個(gè)同事反駁說(shuō)有啊,還有些同事說(shuō)看情況的有,這下有點(diǎn)懵逼了,都不知道那種說(shuō)法是正確的,于是決定花了個(gè)半小時(shí)來(lái)研究驗(yàn)證這個(gè)問(wèn)題,終于得到答案。
怎么驗(yàn)證的呢?
坊間有傳言:MySQL性能優(yōu)化有個(gè)神器,叫做explain,它可以對(duì)select語(yǔ)句進(jìn)行分析并且輸出詳細(xì)的select執(zhí)行過(guò)程的詳細(xì)信息,讓開(kāi)發(fā)者從這些信息中獲得優(yōu)化的思路。
下面來(lái)講講這個(gè)MySQL提供的explain命令:
語(yǔ)法:explain SQL語(yǔ)句例如:
1explain select * from user where id=1 |
執(zhí)行完畢之后,它的輸出有以下字段:
id
select_type
table
partitions
type
possible_keys
key
key_len
ref
rows
Extra
要想知道explain命名怎么使用,就必須把這些字段搞清楚
1. id
SELECT查詢(xún)的標(biāo)識(shí)符, 每個(gè)SELECT語(yǔ)句都會(huì)自動(dòng)分配一個(gè)唯一的標(biāo)識(shí)符
2. select_type
每個(gè)select查詢(xún)字句的類(lèi)型,具體類(lèi)型以及對(duì)應(yīng)作用如下表:
類(lèi)型名 | 解釋 |
---|---|
SIMPLE | 簡(jiǎn)單SELECT,不使用UNION或子查詢(xún)等 |
PRIMARY | 查詢(xún)中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY |
UNION | UNION中的第二個(gè)或后面的SELECT語(yǔ)句 |
DEPENDENT UNION | UNION中的第二個(gè)或后面的SELECT語(yǔ)句,取決于外面的查詢(xún) |
UNION RESULT | UNION的結(jié)果 |
SUBQUERY | 子查詢(xún)中的第一個(gè)SELECT |
DEPENDENT SUBQUERY | 子查詢(xún)中的第一個(gè)SELECT,取決于外面的查詢(xún) |
DERIVED | 派生表的SELECT, FROM子句的子查詢(xún) |
UNCACHEABLE SUBQUERY | 一個(gè)子查詢(xún)的結(jié)果不能被緩存,必須重新評(píng)估外鏈接的第一行 |
3. table
顯示這一行的數(shù)據(jù)是查哪張表的,不過(guò)有時(shí)短路顯示的不是真實(shí)的表名。
4. partitions
匹配的分區(qū)(這個(gè)目前用處不大)
5. type
訪(fǎng)問(wèn)類(lèi)型,表示MySQL在表中找到所需行的方式,對(duì)應(yīng)的值和解釋如下: