Explain包含字段信息
Explain包含字段信息如下:分別是 id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、Extra 10個字段。

Explain各個字段含義
id
- id表示執(zhí)行順序,id值越大,越先執(zhí)行;
- 子查詢,id的序號會遞增;
- id值相同的情況,可以理解為一組,執(zhí)行順序是從上向下。
select_type
- SIMPLE:簡單的select語句,不包含子查詢或者union
- PRIMARY:查詢中包含復(fù)雜查詢(比如子查詢),最外層查詢被標(biāo)記為PRIMARY
- SUBQUERY:當(dāng)select或where包含了子查詢,該子查詢被標(biāo)記為SUBQUERY
- DERIVED:表示包含在from子句中的子查詢的select
- UNION:union中第二個或后面的select語句
- UNION RESULT:代表從union的臨時表中讀取數(shù)據(jù)
table
表名,也有可能是別名或者臨時表
partitions
當(dāng)查詢的是分區(qū)表時,partitions顯示分區(qū)表命中的分區(qū)情況
type
它在 SQL優(yōu)化中是一個非常重要的指標(biāo),以下性能從好到壞依次是:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- system:當(dāng)表僅有一行記錄時(系統(tǒng)表),數(shù)據(jù)量很少,往往不需要進(jìn)行磁盤IO,速度非常快
- const:當(dāng)命中的是主鍵或者唯一索引且為常量
- eq_ref:查詢命中的是主鍵或者唯一索引
- ref:非唯一性索引,會找到超過一條符合條件的行
- ref_or_null:與ref類似,只是會額外搜索包含null值的行
- index_merge:同時使用了兩個或兩個以上的索引
- unique_subquery:子查詢返回不重復(fù)的集合
- index_subquery:區(qū)別于unique_subquery,用于非唯一索引,可以返回重復(fù)值
- range:對有索引的字段,給定范圍檢索,bettween...and、<、>、<=、in 等
- index:遍歷索引樹讀取,而all是從硬盤讀取
- ALL:將遍歷全表以找到匹配的行,性能最差
possible_keys
mysql可能通過某個索引檢索到數(shù)據(jù),但不一定最終查詢會用到
key
key是查詢中實(shí)際使用到的索引,若沒有使用索引,顯示為NULL
key_len
表示查詢用到的索引長度(字節(jié)數(shù)),原則上長度越短越好
- 單列索引,那么需要將整個索引長度算進(jìn)去;
- 多列索引,不是所有列都能用到,需要計算查詢中實(shí)際用到的列。
注:key_len只計算where條件中用到的索引長度,而排序和分組即便是用到了索引,也不會計算到key_len中。
ref
- const:當(dāng)使用常量等值查詢
- 當(dāng)關(guān)聯(lián)查詢時,會顯示相應(yīng)關(guān)聯(lián)表的關(guān)聯(lián)字段
- func:如果查詢條件使用了表達(dá)式、函數(shù),或者條件列發(fā)生內(nèi)部隱式轉(zhuǎn)換
- 其他情況null
rows
rows:以表的統(tǒng)計信息和索引使用情況,估算要找到我們所需的記錄,需要讀取的行數(shù)。
filtered
filtered 這個是一個百分比的值,表里符合條件的記錄數(shù)的百分比。簡單點(diǎn)說,這個字段表示存儲引擎返回的數(shù)據(jù)在經(jīng)過過濾后,剩下滿足條件的記錄數(shù)量的比例。
Extra
額外的信息會在 Extra 字段顯示
1.Using index
查詢到的列被索引覆蓋,實(shí)際上就是覆蓋索引的使用
2.Using where
查詢未用到可用的索引,通過where條件過濾數(shù)據(jù)
3.Using where,Using index
通過where條件過濾數(shù)據(jù),并且查詢用到了覆蓋索引
4.Using index condition
查詢使用到了索引,但是需要回表查詢,5.6及其以上版本才有,之前是Using where
5.Using temporary
查詢后結(jié)果需要使用臨時表來存儲,一般在排序或者分組查詢時用到
6.Using filesort
無法利用索引完成的排序操作,也就是ORDER BY的字段沒有索引
7.Using join buffer
在我們聯(lián)表查詢的時候,如果表的連接條件沒有用到索引,需要有一個連接緩沖區(qū)來存儲中間結(jié)果
8.Impossible where
在我們用不太正確的where語句,導(dǎo)致沒有符合條件的行
9.No tables used
我們的查詢語句中沒有FROM子句,或者有FROM DUAL子句
參考:http://www.itdecent.cn/p/be5b8819e67c
https://www.cnblogs.com/tufujie/p/9413852.html