from之後的查詢得到的表叫做衍生表,是臨時表資料,生成臨時表之後的資料是無法使用索引的,如果資料量大查詢效率就會比較低,這就是查詢要儘量少使用子查詢這些臨時表。
explain詳解
id:
表示查詢序號,也可以表示優先順序;當值都不一樣的時候,值越大表示優先順序越高,越先執行;當值都一樣的時候,按照從上到下的順序去執行。
select_type:
表示查詢的型別,是簡單型別還是複雜型別。
- simple:簡單查詢。查詢不包含子查詢和union。
- primary:複雜查詢中最外層的 select。
- subquery:包含在 select 中的子查詢(不在 from 子句中)。
- derived:包含在 from 子句中的子查詢。MySQL會將結果存放在一個臨時表中,也稱為派生表(derived的英文含義)。
table:
表示查詢的表名,有些真實表有表名,臨時表也會起一個表名,複雜查詢可能沒有表名。表示本行訪問的表。當 from 子句中有子查詢時,table列是 <derivenN> 格式,表示當前查詢依賴 id=N 的查詢,於是先執行 id=N 的查詢。當有 union 時,UNION RESULT 的 table 列的值為<union1,2>,1和2表示參與 union 的 select 行id。
partitions:
表示分割槽資訊,很少使用到。
type:
索引使用型別,很重要。表示查詢範圍。最常使用的是有system,const,eq_ref,ref,range,index,ALL。這些查詢效率從左到右依次降低。一般來說我們要將查詢最佳化到range級別,最好是到ref級別。
- null表示查詢最佳化階段就可以確認要查詢的資料,不用再去查表了。類似掃描個別索引就能獲取到值。
- system,是查詢結果有且僅有一條資料,是const的特例。const是使用主鍵索引,或者唯一索引,查詢結果最多隻有一條資料,掃描次數很少,效率高。
- eq_ref,是equals,也就是說如果有連表查詢,被連的表的查詢條件是主鍵或者唯一鍵,能確認被連表只能查詢一條資料。簡單查詢不會出現這樣的結果。
- ref,表示沒有使用唯一索引,或者使用了唯一索引的部分,查詢到的資料不是唯一的,可能多個也可能一個。
- range,明確的是範圍查詢,常在int,between和and,>,<,>=等,是使用到了索引的查詢,查詢範圍資料,資料量較多。
- index,表示掃描索引就能獲取到全部資料,一般是查詢二級索引,並且要查詢的列都在二級索引上,可以避免回表操作。
- all,表示全表掃描,不會再使用索引了,效率最低。
注意:查詢語句優先查詢二級索引,因為二級索引更小,儲存的資料量更多,如果不滿足,才會去主鍵索引上去查詢。
possible_keys:
表示可能會用到的索引值,可能有多個,也可能為空。
key:
表示真正使用到的索引,該值有可能沒有在possible_keys中顯式,也可能在其中顯式;總的來說兩個沒有必然聯絡,這個是要看MySQL的查詢最佳化器的最佳化。
key_len:
表示使用到的索引的長度值。透過這個值可以算出具體使用了索引中的哪些列。
key_len計算規則如下:
ref:
這一列顯示了在key列記錄的索引中,表查詢值所用到的列或常量,常見的有:const(常量),欄位名(例:film.id)
rows:
表示本次查詢預估的條目數,越少越好。但是這個值並不準確。
filtered 列:
Extra列:
索引最佳最佳化實踐