mysql explain執行計畫詳解

2021-09-19 22:40:30 字數 3867 閱讀 3372

explain select * from table

explain extended select * from table;  show warnings;  得到被優化器優化後的查詢語句

id:數字大的優先執行,如果數字相等,則自上而下執行

select_type 表示select中字句的型別

****** 查詢中不包括子查詢或者union的簡單查詢

primary 若查詢中包含任何複雜的部分,則最外層查詢標記為primary

union union連線的兩個select查詢,第乙個查詢是dervied派生表,除了第乙個表外,第二個以後的表select_type都是union

dependent union 與union一樣,出現在union 或union all語句中,但是這個查詢要受到外部查詢的影響

union result 從union表中獲取結果的select被標記為union result

subquery 除了from字句中包含的子查詢外,其他地方出現的子查詢都可能是subquery,subquery和union還可以被標記為dependent 和 uncacheable

dependent subquery 與dependent union類似,表示這個subquery的查詢要收到外部表查詢的影響

uncacheable 意味著select中的某些特性阻止結果被快取到乙個item_cache中

derived 表示from字句**現的子查詢,也叫做派生表 聯合查詢等

table

顯示的查詢表名,如果查詢使用了別名,那麼這裡顯示的是別名,如果不涉及對資料表的操作,那麼這顯示為null,如果顯示為尖括號括起來的就表示這個是臨時表,後邊的n就是執行計畫中的id,表示結果來自於這個查詢產生。如果是尖括號括起來的,與類似,也是乙個臨時表,表示這個結果來自於union查詢的id為m,n的結果集。

type 表示mysql在表中查詢的方式,即 訪問型別 ,常見型別如下:

system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,all

效能依次遞減,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到乙個索引

system 、const 表示當mysql對查詢的某部分做優化,並轉化為乙個常量時,使用這些型別訪問,如果將主鍵置於where列表中,mysql就能將該型別轉化為乙個常量

eq_ref 出現在要連線的表的查詢計畫中,使用的是唯一索引,對每個索引值,表中只有一條記錄匹配,簡單來說就是多個連表中使用primary key 或者 unique key作為關聯條件

ref 使用非唯一索引掃瞄或者唯一索引的字首掃瞄,返回匹配某個單獨值的記錄行,即一對多的查詢

fulltext 全文索引檢索,要注意,全文索引的優先順序很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引

ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多。

unique_subquery:用於where中的in形式子查詢,子查詢返回不重複值唯一值

index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值,可以使用索引將子查詢去重。

range:索引範圍掃瞄,常見於使用》,

index_merge:表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之後,但是實際上由於要讀取所個索引,效能可能大部分時間都不如range

index:索引全表掃瞄,把索引從頭到尾掃一遍,常見於使用索引列就可以處理不需要讀取資料檔案的查詢、可以使用索引排序或者分組的查詢。

all:這個就是全表掃瞄資料檔案,然後再在server層進行過濾返回符合要求的記錄。

possible_keys

查詢可能使用到的索引,但不一定被查詢使用

key查詢真正使用到的索引,如果沒有使用索引,則顯示null,當select_type為index_merge時,這裡可能出現2個以上的索引,其他的select_type這裡只會出現乙個

ken_len

用於處理查詢的索引長度,如果是單列索引,那就整個索引長度算進去,如果是多列索引,那麼查詢不一定都能使用到所有的列,具體使用到了多少個列的索引,這裡就會計算進去,沒有使用到的列,這裡不會計算進去。留意下這個列的值,算一下你的多列索引總長度就知道有沒有使用到所有的列了。要注意,mysql的icp特性使用到的索引不會計入其中。另外

,key_len只計算where條件用到的索引長度,而排序和分組就算用到了索引,也不會計算到key_len中。

ref

如果是使用的常數等值查詢,這裡會顯示const,如果是連線查詢,被驅動表的執行計畫這裡會顯示驅動表的關聯字段,如果是條件使用了表示式或者函式,或者條件列發生了內部隱式轉換,這裡可能顯示為func

rows

表示mysql根據表統計資訊及索引選用情況,估算的找到所需的記錄所需要讀取的行數

extra 包含不適合在其他列再顯示,但是十分重要的額外的資訊,下面簡單介紹些常用的

distinct:在select中使用了distinct關鍵字

no tables used 不帶form字句的查詢

using filesort:排序時無法使用到索引時,就會出現這個。常見於order by和group by語句中

using index:查詢時不需要回表查詢,直接通過索引就可以獲取查詢的資料。

using intersect:表示使用and的各個索引的條件時,該資訊表示是從處理結果獲取交集

using union:表示使用or連線各個使用索引的條件時,該資訊表示從處理結果獲取並集

using sort_union和using sort_intersection:與前面兩個對應的類似,只是他們是出現在用and和or查詢資訊量大時,先查詢主鍵,然後進行排序合併後,才能讀取記錄並返回。

using where:表示儲存引擎返回的記錄並不是所有的都滿足查詢條件,需要在server層進行過濾。查詢條件中分為限制條件和檢查條件,5.6之前,儲存引擎只能根據限制條件掃瞄資料並返回,然後server層根據檢查條件進行過濾再返回真正符合查詢的資料。5.6.x之後支援icp特性,可以把檢查條件也下推到儲存引擎層,不符合檢查條件和限制條件的資料,直接不讀取,這樣就大大減少了儲存引擎掃瞄的記錄數量。extra列顯示using index condition

firstmatch(tb_name):5.6.x開始引入的優化子查詢的新特性之一,常見於where字句含有in()型別的子查詢。如果內錶的資料量比較大,就可能出現這個

loosescan(m..n):5.6.x之後引入的優化子查詢的新特性之一,在in()型別的子查詢中,子查詢返回的可能有重覆記錄時,就可能出現這個

using temporary 表示mysql需要使用臨時表來儲存結果集,常見於排序和分組查詢

impossible where 這個值強調了where語句會導致沒有符合條件的行。

index merges mysql 決定要在乙個給定的表上使用超過乙個索引的時候,就會出現以下格式中的乙個,詳細說明使用的索引以及合併的型別。

using sort_union(...)

using union(...)

using intersect(...)

filtered 使用explain extended時會出現這個列,5.7之後的版本預設就有這個字段,不需要使用explain extended了。這個字段表示儲存引擎返回的資料在server層過濾後,剩下多少滿足查詢的記錄數量的比例,注意是百分比,不是具體記錄數。

開開心心編碼,快快樂樂生活。

Mysql explain 執行計畫

使用方法,在select語句前加上explain就可以了 如 explain select from test1 explain列的解釋 table 顯示這一行的資料是關於哪張表的 type 這是重要的列,顯示連線使用了何種型別。從最好到最差的連線型別為const eq reg ref range ...

MySql Explain執行計畫

explain執行計畫 例 explain select from user idselect type table partitions type possible keys keykey len refrows filtered extra id 查詢序列號,表示查詢中執行select子句或操作...

MySQL Explain 執行計畫

執行計畫就是sql的執行查詢的順序,以及如何使用索引查詢,返回的結果集行數,可以根據執行計畫結果結合業務對現有sql進行優化 explain 查詢結果有10列,分別表示的含義是 是乙個有序的編號,是查詢的順序號,有幾個select就顯示幾行,id的順序是按照select出現的順序增長的,id列的值越...