explain命令用來查看一個(gè)SQL語句的執(zhí)行計(jì)劃,了解我們所寫的sql有沒有執(zhí)行索引粤剧,是不是進(jìn)行了全表掃描。
一.explain使用方式
在sql語句前加上explain,explain只能解釋select操作养篓,其他操作要重寫為select后查看執(zhí)行計(jì)劃。
eg:
表:
索引:
執(zhí)行計(jì)劃
explain select * from user_info where name = '測(cè)試';
執(zhí)行結(jié)果:
二.各項(xiàng)結(jié)果介紹:
1.id:sql片段執(zhí)行的順序
-
id相同 :執(zhí)行順序由上到下
-
id不相同 :如果是子查詢赂蕴,id的序號(hào)會(huì)遞增柳弄。id值越大,優(yōu)先級(jí)越高概说,越先被執(zhí)行碧注。
- 在所有組中,id值越大糖赔,優(yōu)先級(jí)越高萍丐,越先執(zhí)行
2.select_type:查詢類型
-
SIMPLE
:簡(jiǎn)單SELECT(不使用UNION或子查詢等)。 -
PRIMARY
:查詢中若包含任何復(fù)雜的子部分放典,最外層查詢則被標(biāo)記為primary 逝变。 -
UNION
:union語句中的第二個(gè)或后面的SELECT語句;若 union 包含在from子句的子查詢中奋构,外層 select 將被標(biāo)記為 derived骨田。例:
-
UNION RESULT
: UNION的結(jié)果,union語句中第二個(gè)select開始后面所有select声怔。 -
DEPENDENT UNION
:union中的第二個(gè)或后面的SELECT語句态贤,取決于外面的查詢 -
SUBQUERY
:子查詢中的第一個(gè)SELECT,結(jié)果不依賴于外部查詢醋火。 -
DEPENDENT SUBQUERY
:子查詢中的第一個(gè)SELECT悠汽,依賴于外部查詢。 -
DERIVED
:派生表的SELECT, FROM子句的子查詢芥驳。在 from 列表 中包含的子查詢被標(biāo)記為 derived(衍生)柿冲,MySQL會(huì)遞歸執(zhí)行這些子查詢,把結(jié)果放在臨時(shí)表中兆旬。 -
UNCACHEABLE SUBQUERY
:一個(gè)子查詢的結(jié)果不能被緩存假抄,必須重新評(píng)估外鏈接的第一行
3.table:sql片段所對(duì)應(yīng)的表
4.type:索引類型
常用的類型有: all、index、range宿饱、 ref熏瞄、eq_ref、const谬以、system强饮、null(從左到右,性能從差到好)
-
all
:最壞的情況, 從頭到尾全表掃描 -
index
:全索引掃描为黎,index與all區(qū)別為index類型只遍歷索引樹(index 是從索引中讀取的邮丰,而 all 是從硬盤)。掃描表的時(shí)候按照索引次序進(jìn)行而不是行铭乾,主要優(yōu)點(diǎn)就是避免了排序, 但是開銷仍然非常大剪廉。 -
range
:使用索引范圍查詢。這個(gè)類型通常出現(xiàn)在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中炕檩。它開始于索引的某一點(diǎn)妈经,而結(jié)束于索引的另一點(diǎn),不用掃描全部索引捧书,所以優(yōu)于index
。 -
ref
:除唯一或非主鍵索引外骤星,使用普通索引经瓷,返回符合條件的所有行。 叫做ref是因?yàn)樗饕硞€(gè)參考值相比較. 這個(gè)參考值或者是一個(gè)數(shù), 或者是來自一個(gè)表里的多表查詢的結(jié)果值洞难。 例:'SELECT * FROM tbl WHERE idx_col=expr;'
-
eq_ref
:跟ref
類似舆吮,區(qū)別是eq_ref
常用于主鍵或唯一索引掃描,每個(gè)索引鍵值队贱,表中只有一條記錄匹配色冀。讀取本表中和關(guān)聯(lián)表表中的每行組合成的一行。除 了 system 和 const 類型之外, 這是最好的連接類型柱嫌。例:'SELECT * FROM reftable,tbl WHERE reftable.key_column=tbl.column;'
-
const
:用于針對(duì)主鍵或唯一索引的等值查詢掃描锋恬,最多只返回一行數(shù)據(jù),所以很快编丘。const
與eq_ref
的區(qū)別:const是直接按主鍵或唯一鍵讀取与学,eq_ref用于聯(lián)表查詢的情況,按聯(lián)表的主鍵或唯一鍵聯(lián)合查詢嘉抓。 -
system
:system是const類型的特例索守,當(dāng)表中只有一行的情況下,使用system
抑片。 -
null
:MySQL在優(yōu)化過程中分解語句卵佛,執(zhí)行時(shí)甚至不用訪問表或索引,例如從一個(gè)索引列里選取最小值可以通過單獨(dú)索引查找完成。
5.possible_keys:可能使用的索引截汪。
顯示可能應(yīng)用在這張表中的索引疾牲,一個(gè)或多個(gè)。查詢涉及到的字段上若存在索引挫鸽,則該索引將被列出说敏,但不一定被查詢實(shí)際使用。
6.key:表示實(shí)際使用的索引丢郊。
若為null盔沫,則表示沒有使用到索引。原因:a.字段沒建對(duì)應(yīng)的索引枫匾;b.索引已建架诞,但是查詢條件導(dǎo)致索引失效(如or
、like
干茉、!=
谴忧、<
)。
7.key_len:索引字段的可能最大長(zhǎng)度
表示索引中使用的字節(jié)數(shù)角虫,可通過該列計(jì)算查詢中使用的索引的長(zhǎng)度(key_len顯示的值為索引字段的最大可能長(zhǎng)度沾谓,并非實(shí)際使用長(zhǎng)度,即key_len是根據(jù)表定義計(jì)算而得戳鹅,不是通過表內(nèi)檢索出的)均驶。
不損失精確性的情況下,長(zhǎng)度越短越好 枫虏。
key_len 的計(jì)算規(guī)則:
-
字符串
char(n):n 字節(jié)長(zhǎng)度
varchar(n):如果是 utf8 編碼, 則是( 3 n + 2)個(gè)字節(jié)妇穴;如果是 utf8mb4 編碼, 則是 (4 n + 2)個(gè)字節(jié)。 -
數(shù)值類型
tinyint:1字節(jié)
smallint: 2字節(jié)
mediumint: 3字節(jié)
int:4字節(jié)
bigint: 8字節(jié) -
時(shí)間類型
date:3字節(jié)
timestamp: 4字節(jié)
datetime: 8字節(jié) - 字段屬性: null 屬性 占用1個(gè)字節(jié)隶债。如果一個(gè)字段是 not null 的腾它, 則沒有此屬性。
8.ref:使用索引的列名
顯示了在 key
列記錄的索引中死讹,表查找值所用到的列或常量瞒滴,常見的有:const(常量),func赞警,N
9.rows:掃描出的行數(shù)(估算的行數(shù))
估算出結(jié)果集行數(shù)逛腿,表示MySQL根據(jù)表統(tǒng)計(jì)信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù)
10.Extra:額外信息
執(zhí)行情況的描述和說明仅颇。
- Using index:只需通過索引就可以從表中獲取列的信息单默,無需額外去讀取真實(shí)的行數(shù)據(jù)。如果查詢使用的列值僅僅是一個(gè)簡(jiǎn)單索引的部分值忘瓦,則會(huì)使用這種策略來優(yōu)化查詢搁廓。
- Using index condition:在mysql 5.6版本后加入的新特性(Index Condition Pushdown)引颈。Using index condition 會(huì)先條件過濾索引,過濾完索引后找到所有符合索引條件的數(shù)據(jù)行境蜕,隨后用 WHERE 子句中的其他條件去過濾這些數(shù)據(jù)行
- Using where:不用讀取表中所有信息蝙场,僅通過索引就可以獲取所需數(shù)據(jù),這發(fā)生在對(duì)表的全部的請(qǐng)求列都是同一個(gè)索引的部分的時(shí)候粱年,表示mysql服務(wù)器將在存儲(chǔ)引擎檢索行后再進(jìn)行過濾售滤。
- Using temporary:表示MySQL需要使用臨時(shí)表來存儲(chǔ)結(jié)果集,常見于排序和分組查詢台诗,常見 group by ; order by
- Using filesort:當(dāng)Query中包含 order by 操作完箩,而且無法利用索引完成的排序操作稱為“文件排序”
- Using join buffer:改值強(qiáng)調(diào)了在獲取連接條件時(shí)沒有使用索引,并且需要連接緩沖區(qū)來存儲(chǔ)中間結(jié)果拉队。如果出現(xiàn)了這個(gè)值弊知,那應(yīng)該注意,根據(jù)查詢的具體情況可能需要添加索引來改進(jìn)能粱快。
- Impossible where:這個(gè)值強(qiáng)調(diào)了where語句會(huì)導(dǎo)致沒有符合條件的行(通過收集統(tǒng)計(jì)信息不可能存在結(jié)果)秩彤。
- Select tables optimized away:這個(gè)值意味著僅通過使用索引,優(yōu)化器可能僅從聚合函數(shù)結(jié)果中返回一行
- No tables used:Query語句中使用from dual 或不含任何from子句