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