天天看點

mysql Explain查詢計劃Explain 中的列

Explain 中的列

1.id列:

id列的編号是select的序列号,有幾個select就有幾個id,并且id的順序是按select出現的順序增長的,mysql将select查詢分為簡單查詢(simple)和複雜查詢(primary)

複雜查詢分為三類:簡單查詢,派生表(from語句中的字查詢),union查詢

id 列越大執行優先級越高,id相同則沖上往下執行,id為null最後執行

2.select_type 列

表示對應行是簡單還是複雜的查詢,如果是複雜的查詢,又是上述三種複雜查詢中的哪一種

simple :簡單查詢,查詢不包含字查詢和union

primary: 複雜查詢彙總最外層的select

subquery: 包含在select中的子查詢(不在from子句中)

derived:包含在from子句中的字查詢,mysql會将結果存放在一個曆史表中,也稱為派生表(derived的英文含義)

union :在union中的第二個和随後的select

union result:從union曆史表檢索結果的select

3. table 表名

4.type 列

這一清單示關聯類型或通路類型,即mysql決定如何查找表中的行,查找資料行記錄的大概範圍。

依次從最優到最差分别為:system>const>eq_ref>ref>range>index>all

一般來說,得保證查詢達到range級别,最好達到ref

NULL:mysql 能在優化階段分解查詢語句,在執行階段用不着再通路表或索引,例如:在索引列中選取最小值,可以單獨查找索引來完成,不需要在執行時通路表

const,system:mysql能在堆查詢的某部分進行優化并将其轉化成一個常量(可以看show warnings的結果),用于primarykey 或 unique key的馊油列與常數比較時,是以表最多有一個比對行,讀取1次,速度比較快,system是const的特例,表裡面隻有一條元組,比對時為system

eq_ref : primary key 或unique key索引的所有部分被連接配接使用,最多智慧傳回一條符合條件的記錄,這可能是在const之外最好 的聯接類型了,簡單的select查詢不會出現這種type

ref: 相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分字首,索引要和某個值相比較,可能會找到多個符合條件的行

range: 範圍掃描通常出現在in() 、between、 >、 <、 >=等操作中,使用一個索引來檢索給定範圍的行

index: 掃描全表索引,這通常比ALL快一些。(index是從索引中讀取的,而all是從磁盤中讀取的)

ALL:全表掃描,意味着mysql需要從頭到尾的查找所需要的行,通常情況下這需要增加索引來優化

5 possible_keys列

這一列顯示查詢可能使用哪些索引來查找

explain時可能出現possible_key有列,而key顯示null的情況,這種情況是因為表中的資料不多,mysql認為索引對此查詢幫助不大,選擇了全表查詢。

如果該列是null,則沒有相關索引,在這種情況下,可以通過檢查where子句看是否可以創造一個适當的索引來提高查詢性能,然後用explain檢視效果.

6.key列

這一列顯示mysql實際采用哪個索引來優化對該表的通路。

如果沒有使用索引,則該列是null。如果想強制mysql使用或者無視possible_keys中的索引,在查詢是使用force index、ignore index

7. key_len列

這一列顯示了mysql在索引裡使用的位元組數,通過這個值可以算出具體使用了索引中的那些列。

舉例來說。film_actor的聯合索引 idx_film_actor_id由film_id 和actor_id兩個int列組成。并且每個int是4位元組,通過結果中的key_len=4可推斷出查詢使用了第一個列:film_id列來執行索引查找

8 ref列

這一列顯示了在key列記錄的索引中,表查找值所用到的列或者常量,常見的有const(常量),字段名

繼續閱讀