MySQL 語句 Explain 分析


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格式化EXPLAINSELECT類型公開 為a的屬性 query_block,除非它是 SIMPLEPRIMARY表中還顯示了JSON名稱(如果適用)。

select_type 值 JSON名稱 含義
SIMPLE None 簡單SELECT(不使用 UNION或子查詢)
PRIMARY None 最 SELECT
UNION None 第二次或以后的SELECT陳述 UNION
DEPENDENT UNION dependenttrue a中的第二個或更晚的SELECT語句 UNION,取決於外部查詢
UNION RESULT union_result 的結果UNION
SUBQUERY None 首先SELECT是子查詢
DEPENDENT SUBQUERY dependenttrue 首先SELECT在子查詢中,依賴於外部查詢
DERIVED None 派生表
MATERIALIZED materialized_from_subquery 物化子查詢
UNCACHEABLE SUBQUERY cacheablefalse 無法緩存結果的子查詢,必須為外部查詢的每一行重新計算
UNCACHEABLE UNION cacheablefalse 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等價物 SIMPLEPRIMARY

select_typeSELECT語句 的顯示受影響的表的語句類型。例如,select_type是 DELETE用於 DELETE陳述。

table(JSON名: table_name

輸出行引用的表的名稱。這也可以是以下值之一:

<unionM,N>:行指的是id值為M的行 的 並集 N

<derivedN>:該行是指用於與該行的派生表結果id的值 N例如,派生表可以來自FROM子句中的子查詢 

<subqueryN>:行指的是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主鍵值與每個輔助索引一起存儲。如果 keyNULL,MySQL沒有找到用於更有效地執行查詢的索引。

要強制MySQL使用或忽略列出的索引 possible_keys列,使用 FORCE INDEXUSE INDEXIGNORE 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輸出格式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM