Explain語法:explain select … from … [where …]
例如:explain select * from news;
EXPLAIN輸出列
| 列 | JSON名稱 | 含義 |
|---|---|---|
id |
select_id |
該SELECT標識符 |
select_type |
None | 該SELECT類型 |
table |
table_name |
輸出行的表 |
partitions |
partitions |
匹配的分區 |
type |
access_type |
連接類型 |
possible_keys |
possible_keys |
可供選擇的索引 |
key |
key |
實際選擇的指數 |
key_len |
key_length |
所選鍵的長度 |
ref |
ref |
列與索引進行比較 |
rows |
rows |
估計要檢查的行 |
filtered |
filtered |
按表條件過濾的行的百分比 |
Extra |
None | 附加信息 |
id(JSON名: select_id)
SELECT標識符。這是SELECT查詢中的序號 。NULL如果行引用其他行的聯合結果,則該值可以是。在這種情況下,該 table列顯示一個值 ,表示該行引用值為和的行的 並集 。 <unionM,N>idMN
select_type (JSON名稱:無)
類型SELECT,可以是下表中顯示的任何類型。JSON格式化EXPLAIN將SELECT類型公開 為a的屬性 query_block,除非它是 SIMPLE或PRIMARY。表中還顯示了JSON名稱(如果適用)。
select_type 值 |
JSON名稱 | 含義 |
|---|---|---|
SIMPLE |
None | 簡單SELECT(不使用 UNION或子查詢) |
PRIMARY |
None | 最 SELECT |
UNION |
None | 第二次或以后的SELECT陳述 UNION |
DEPENDENT UNION |
dependent(true) |
a中的第二個或更晚的SELECT語句 UNION,取決於外部查詢 |
UNION RESULT |
union_result |
的結果UNION。 |
SUBQUERY |
None | 首先SELECT是子查詢 |
DEPENDENT SUBQUERY |
dependent(true) |
首先SELECT在子查詢中,依賴於外部查詢 |
DERIVED |
None | 派生表 |
MATERIALIZED |
materialized_from_subquery |
物化子查詢 |
UNCACHEABLE SUBQUERY |
cacheable(false) |
無法緩存結果的子查詢,必須為外部查詢的每一行重新計算 |
UNCACHEABLE UNION |
cacheable(false) |
UNION 屬於不可緩存的子查詢的第二個或后一個選擇(請參閱參考資料 UNCACHEABLE SUBQUERY) |
DEPENDENT通常表示使用相關子查詢。請參見 第13.2.11.7節“相關子查詢”。
DEPENDENT SUBQUERY評估與評估不同UNCACHEABLE SUBQUERY。因為DEPENDENT SUBQUERY,子查詢僅針對來自其外部上下文的變量的每組不同值重新評估一次。對於 UNCACHEABLE SUBQUERY
當您指定FORMAT=JSON時 EXPLAIN,輸出沒有直接等效的單個屬性 select_type; 該 query_block屬性對應於給定的SELECT。可以使用與SELECT剛顯示的大多數子查詢類型等效的屬性(示例 materialized_from_subquery為 MATERIALIZED),並在適當時顯示。沒有JSON等價物 SIMPLE或PRIMARY。
select_type非SELECT語句 的值顯示受影響的表的語句類型。例如,select_type是 DELETE用於 DELETE陳述。
table(JSON名: table_name)
輸出行引用的表的名稱。這也可以是以下值之一:
<union:行指的是M,N>id值為M和的行 的 並集 N。
<derived:該行是指用於與該行的派生表結果N>id的值 N。例如,派生表可以來自FROM子句中的子查詢 。
<subquery:行指的是N>id 值為的行的具體化子查詢的結果N。請參見 第8.2.2.2節“使用實現優化子查詢”。
partitions(JSON名: partitions)
記錄將與查詢匹配的分區。該值適用NULL於非分區表。請參見 第23.3.5節“獲取有關分區的信息”。
type(JSON名: access_type)
連接類型。有關不同類型的說明,請參閱 EXPLAIN 連接類型。
possible_keys(JSON名: possible_keys)
該possible_keys列指示MySQL可以選擇在此表中查找行的索引。請注意,此列完全獨立於輸出中顯示的表的順序 EXPLAIN。這意味着某些鍵possible_keys可能無法在生成中使用生成的表順序。
如果此列是NULL(或在JSON格式的輸出中未定義),則沒有相關索引。在這種情況下,您可以通過檢查WHERE 子句來檢查它是否引用適合索引的某些列或列來提高查詢性能。如果是,請創建適當的索引並EXPLAIN再次檢查查詢 。請參見 第13.1.9節“ALTER TABLE語法”。
要查看表的索引,請使用。 SHOW INDEX FROM tbl_name
key(JSON名:key)
該key列指示MySQL實際決定使用的密鑰(索引)。如果MySQL決定使用其中一個possible_keys 索引來查找行,那么該索引將被列為鍵值。
可能key會命名值中不存在的索引 possible_keys。如果沒有possible_keys索引適合查找行,則會發生這種情況,但查詢選擇的所有列都是其他索引的列。也就是說,命名索引覆蓋了所選列,因此雖然它不用於確定要檢索的行,但索引掃描比數據行掃描更有效。
因為InnoDB,即使查詢還選擇主鍵,輔助索引也可能覆蓋所選列,因為InnoDB主鍵值與每個輔助索引一起存儲。如果 key是NULL,MySQL沒有找到用於更有效地執行查詢的索引。
要強制MySQL使用或忽略列出的索引 possible_keys列,使用 FORCE INDEX,USE INDEX或IGNORE INDEX在您的查詢。請參見第8.9.4節“索引提示”。
對於MyISAM表,運行 ANALYZE TABLE有助於優化器選擇更好的索引。對於 MyISAM表格,myisamchk --analyze也是如此。請參見 第13.7.3.1節“ANALYZE TABLE語法”和 第7.6節“MyISAM表維護和崩潰恢復”。
key_len(JSON名: key_length)
該key_len列指示MySQL決定使用的密鑰的長度。該值 key_len使您可以確定MySQL實際使用的多部分密鑰的多少部分。如果key列說NULL,該len_len 列也說NULL。
由於密鑰存儲格式,對於可能NULL 比列的列,密鑰長度更大NOT NULL。
ref(JSON名:ref)
該ref列顯示哪些列或常量與列中指定的索引進行比較,以 key從表中選擇行。
如果值為func,則使用的值是某個函數的結果。要查看哪個函數,請使用 SHOW WARNINGS以下內容 EXPLAIN查看擴展 EXPLAIN輸出。該函數實際上可能是算術運算符等運算符。
rows(JSON名: rows)
該rows列指示MySQL認為必須檢查以執行查詢的行數。
對於InnoDB表格,此數字是估算值,可能並不總是准確的。
filtered(JSON名: filtered)
該filtered列指示將按表條件過濾的表行的估計百分比。最大值為100,這意味着不會對行進行過濾。值從100開始減少表示過濾量增加。 rows顯示檢查的估計行數,rows× filtered表示將與下表連接的行數。例如,如果 rows是1000並且 filtered是50.00(50%),則使用下表連接的行數是1000×50%= 500。
Extra (JSON名稱:無)
此列包含有關MySQL如何解析查詢的其他信息。有關不同值的說明,請參閱 EXPLAIN 附加信息。
沒有與Extra列對應的單個JSON屬性 ; 但是,此列中可能出現的值將作為JSON屬性公開,或作為屬性的文本公開message。
文章來源:EXPLAIN輸出格式
