目錄
基本語法:
各個字段的含義:
id:
select_type:
table:
partitions:
type:
possible_keys:
key:
key_len:
ref:
row:
filtered:
extra:
EXPLAIN用于解析SQL語句的執行計劃,展示MySQL如何進行查詢。
基本語法:
EXPLAIN SELECT 具體的執行語句;
各個字段的含義:
id:
在一個大的查詢語句中每一個select關鍵字都對應一個唯一的id。
需要注意的是:
1.查詢優化器可能會對設計子查詢的查詢語句進行重寫,將子查詢轉換為多表查詢的操作。
所以可能id編號和select數不等。如:
explain select * from 表1 where 字段 in (select 字段1 from 表2
where 條件);
2.因為union是要進行去重的,進行去重時是在表1和表2組成的臨時表中去重。所以會多一條記錄。臨時表記錄id為NULL。注意union all是不需要去重的,所以不用建立臨時表。
3.id相同的話,優先級相同,從上往下順序執行。id不同的話,id越大優先級越高,就越先執行。
4.每一個id表示一趟獨立的查詢,sql查詢的趟數越少越好。
select_type:
select關鍵字對應的查詢類型。
查詢語句中不包含union或者子查詢的為"SIMPLE"。
當包含union(union all)或者子查詢時,其中外層主查詢的查詢為"PRIMARY",第二個查詢以及之后的查詢為"UNION"。
包含union(union all)的查詢中,如果小查詢都依賴于外層查詢,那么除了最左邊的小查詢之外,其余的都是"DEPENDENT UNION"。
對于union查詢去重的,是在臨時表上進行的去重,所以針對該臨時表為"UNION RESULT"。
對于子查詢,如果包含子查詢的語句不能轉化為多表查詢且該子查詢不為相關子查詢,那么該子查詢第一個select關鍵字代表的查詢為"SUBQUERY",但是如果是相關子查詢,那么則為"DEPENDENT SUBQUERY"。
對于派生表的查詢,該派生表對應的子查詢是"DERIVED"。
當查詢優化器在致辭那個包含子查詢的語句時,將子查詢物化之后與外層查詢進行連接查詢時,該查詢為"MATERIALIZED"。
table:
無論查詢語句多復雜包含多少個表,都是需要對每一個表進行單表訪問的,索引MySQL規定explain語句輸出的每條記錄都對應著某個單表的訪問方法(每一行記錄都對應著一個單表),該條記錄的table列代表著該表的表名,不一定是真實的表名也可能是實際表、派生表或UNION結果集的臨時表。
partitions:
代表分區表中的命中情況,非分區表為NULL,一般情況下都是NULL。
type:
表示數據訪問方式,按效率從高到低。
當表中只有一條記錄且該表使用的存儲引擎的統計數據是精確的,為"system"。
根據主鍵或者唯一二級索引列與常數進行等值匹配,為"const"。
連接查詢時,被驅動表通過主鍵或者唯一二級索引列等值匹配,為"eq_ref"。
普通二級索引列與常量等值匹配,該索引列的值也可以為NULL時,可能為"ref_or_null"。
包含in子查詢的語句中,如果優化器將in子查詢轉化為exists子查詢且可以使用主鍵進行等值匹配,為"unique_subquery"。
使用索引能夠獲取范圍區間的記錄,為"range"。
當使用索引覆蓋,但需要掃描全部索引時,為"index"。
全表掃描時,為"all"。
possible_keys:
查詢時可能用到的索引,一般涉及到的字段存在索引都會列出,但是不一定使用。
key:
實際查詢用到的索引,如果沒有使用索引則為NULL。
key_len:
查詢中實際使用到的索引長度(字節數)。檢查是否充分利用了索引,值越大越好,主要針對于聯合索引,判斷具體命中了哪些列。
ref:
使用索引列等值查詢時,與索引進行等值匹配的對象信息。
row:
預估的需要讀取的記錄條數,值越小越好,因為讀取的數據量越小,I/O次數可能會更少。
filtered:
經過搜索條件過濾后的記錄條數占預估讀取的記錄數的百分比,值越大越好,說明越匹配。
extra:
補充查詢時的額外信息。
當查詢語句沒有from子句時會提示"no table used"。
查詢語句where子句永遠為false時將會提示"impossible where"。
使用全表掃描來執行對某個表的查詢,且該語句中有針對該表的搜索條件(未完全利用索引),會提示"using where"。
當查詢列表處有MIN或者MAX聚合函數,但沒有符合的where子句的搜索條件的記錄時,會提示"no matching min/max row",如果有的話,則提示"select tables optimized away"。
當查詢列表以及搜索條件只包含屬于某個索引的列,也就是覆蓋索引,會提示"using index"。
當使用左(外)連接時,如果where子句中包含要求被驅動的某個列等于null值的搜索條件且不允許存儲null值時,會提示"using where; not exists"。
當limit子句的參數為0,提示"zero limit"。
如果查詢使用了文件排序的方式執行查詢,會提示"using filesort",需要進行優化,為排序字段增加索引。
查詢中借助了臨時表,則會提示"using temporary",需要優化,最好用索引替代臨時表。