一. 執行計劃返回信息詳解
①. 執行計劃所含字段
輸出列含義id查詢標識
select_type查詢類型
table查詢涉及的表
partitions匹配到的分區信息
type連接類型
possible_keys可能選擇的索引
key實際使用的索引
key_len實際使用的索引的長度
ref和索引進行比較的列
rows需要被檢索的大致行數
filtered按表條件過濾的行百分比
Extra額外信息
②. id
執行計劃序列號,可出現3種組合方式
第一種:id全部相同,這時會從上至下依次執
第二種:部分id相同,這時會按照id大小從大到小執行;id相同的則會被認定為是一組執行計劃,同一組遵循第一種id全相同的順序執行
UNION RESULT:UNION的結果
第三種:id全部不相同,這時會按照id大小從大到小執行
SIMPLE:簡單的select查詢,查詢中不包含子查詢或者UNION
PRIMARY:查詢中若包含任何復雜的子部分,最外層查詢則被標記為
SUBQUERY:在SELECT或WHERE列表中包含了子查詢
DERIVED:在FROM列表中包含的子查詢被標記為DERIVED(衍生)MYSQL會遞歸執行這些子查詢,把結果放在臨時表里
UNION:若第二個SELECT出現在UNION之后,則被標記為UNION若UNION包含在FROM子句的子查詢中,外層SELECT將被標記為:DERIVED
UNION RESULT:從UNION表獲取結果的SELECT
④. table
查詢涉及的表
⑤. partitions
由查詢匹配記錄的分區。非分區表為NULL
鏈接類型說明system表只有一行,MyISAM引擎。
const常量連接,表最多只有一行匹配,通用用于主鍵或者唯一索引比較時
eq_ref每次與之前的表合并行都只在該表讀取一行,這是除了system,const之外最好的一種,特點是使用=,而且索引的所有部分都參與join且索引是主鍵或非空唯一鍵的索引
ref如果每次只匹配少數行,那就是比較好的一種,使用=或<=>,可以是左覆蓋索引或非主鍵或非唯一鍵
fulltext全文搜索
ref_or_null與ref類似,但包括NULL
index_merge表示出現了索引合并優化(包括交集,并集以及交集之間的并集),但不包括跨表和全文索引。這個比較復雜,目前的理解是合并單表的范圍索引掃描(如果成本估算比普通的range要更優的話)
unique_subquery在in子查詢中,就是value in (select…)把形如select unique_key_column的子查詢替換。PS:所以不一定in子句中使用子查詢就是低效的!
index_subquery同上,但把形如”select non_unique_key_column“的子查詢替換
range常數值的范圍
index索引樹掃描。a.當查詢是索引覆蓋的,即所有數據均可從索引樹獲取的時候(Extra中有Using Index);b.以索引順序從索引中查找數據行的全表掃描(無 Using Index);c.如果Extra中Using Index與Using Where同時出現的話,則是利用索引查找鍵值的意思;d.如單獨出現,則是用讀索引來代替讀行,但不用于查找
all全表掃描(full table scan)由上到下性能最好到最差
⑦. possible_keys
列出查詢涉及到的字段的索引,但不一定會被使用
⑧. key
實際使用的索引,如果為NULL,則沒有使用索引
⑨. key_len
表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好。key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的。
⑩. ref
和前方表連接的字段,const代表是常量值連接
?. rows
查詢大致需要涉及讀取的行數,越少越好
?. extra
包含不適合在其他列中顯式但十分重要的額外信息(暫不展開)