簡(jiǎn)介
mysql explain(或desc)用于分析SQL語(yǔ)句的執(zhí)行計(jì)劃,多用于測(cè)試查詢性能。語(yǔ)法:explain sql...
注意
- explain執(zhí)行DML語(yǔ)句,數(shù)據(jù)不發(fā)生變化。
- explain執(zhí)行的結(jié)果可以有多條數(shù)據(jù),一條數(shù)據(jù)對(duì)應(yīng)一個(gè)表,如果涉及union,MySQL內(nèi)部會(huì)產(chǎn)生一個(gè)臨時(shí)表,就會(huì)導(dǎo)致結(jié)果多一行數(shù)據(jù)。
- union all不會(huì)創(chuàng)建臨時(shí)表,所以就不會(huì)有多一行的數(shù)據(jù)。
id
這是select編號(hào),不是返回結(jié)果的自增id。
值越大優(yōu)先級(jí)越高。
如果涉及多表join,id就會(huì)重復(fù),因?yàn)榫鸵粋€(gè)select。
涉及子查詢,MySQL Server 優(yōu)化器 可能會(huì)把子查詢轉(zhuǎn)化為join,所以聯(lián)調(diào)select id可能都是1
涉及union,臨時(shí)表的那一列,id值為null。
select_type
操作類型,包括簡(jiǎn)單表查詢、聯(lián)合查詢、子查詢等。
- SIMPLE: 簡(jiǎn)單表查詢,不包含union或者子查詢。
- PRIMARY: 主查詢,復(fù)雜查詢中的最外層查詢,或者union中左邊的表。
- SUBQUERY: 不相關(guān)子查詢
- DEPENDENT SUBQUERY: 依賴外部查詢的子查詢,或者稱之為相關(guān)子查詢。
- DERIVED: 派生表,從查詢結(jié)果派生的臨時(shí)表,from后面的子查詢。
- UNION: UNION 查詢中各個(gè)子查詢的操作類型。
- UNION RESULT: UNION 查詢的結(jié)果集。
- DEPENDENT UNION: 依賴外部查詢的 UNION 查詢,也就是子查詢中有union
- UNCACHEABLE SUBQUERY: 無(wú)法被緩存的子查詢。
- UNCACHEABLE UNION: 無(wú)法被緩存的 UNION 查詢。
table
被操作的表,用于顯示被操作的對(duì)象。
實(shí)際表名:表示查詢語(yǔ)句中直接引用的表名。
- <derivedN>:表示派生表,它是從查詢結(jié)果中派生出來(lái)的臨時(shí)表,派生表的編號(hào)可能是 1、2、3 等。
- <unionM-N>:表示 UNION 查詢中的結(jié)果集,其中 M 表示結(jié)果集的編號(hào),N 表示 UNION 查詢中的子查詢編號(hào)。
- <temporary>:表示臨時(shí)表,這是在查詢過(guò)程中創(chuàng)建的臨時(shí)存儲(chǔ)表。
- <subqueryN>:表示子查詢結(jié)果,其中 N 是子查詢的編號(hào)。
partitions
分析 MySQL 查詢語(yǔ)句如何利用分區(qū)表的工具,可以查看 MySQL 執(zhí)行查詢時(shí)會(huì)涉及到哪些分區(qū),以及查詢優(yōu)化器如何選擇分區(qū)來(lái)執(zhí)行查詢。
type
返回在執(zhí)行查詢時(shí)使用的訪問(wèn)方法,和索引相關(guān), 已做排序。
- system,當(dāng)使用MyiSAM或Memory引擎的表只有一條記錄的時(shí)候是system,不要奢望。
- const:使用主鍵索引,或唯一索引等值匹配。
- eq_ref:使用join時(shí),被驅(qū)動(dòng)表通過(guò)主鍵或者唯一索引列進(jìn)行等值關(guān)聯(lián)的方式,例如select * from a left join b on a.id = b.id;,b是eq_ref,a是all。
- ref: 使用非唯一索引等值匹配。
- range:對(duì)添加過(guò)任意索引的列,進(jìn)行范圍匹配,<、<=、>、>=、in、between。
- index:MySQL 使用索引來(lái)掃描整個(gè)索引樹(shù),不需要回表,通常會(huì)發(fā)生在覆蓋索引的情況。
- ALL:全表掃描。
不常見(jiàn)類型:
- fulltext:全文索引。
- ref_or_null:對(duì)二級(jí)索引進(jìn)行等值匹配,并添加or = null的條件。
- index_merge:使用了多個(gè)單列索引來(lái)執(zhí)行查詢。當(dāng)在查詢條件中存在多個(gè)列,且每個(gè)列都有單獨(dú)的索引時(shí)。
- unique_subquery:不容易遇見(jiàn),in 后面跟子查詢,查詢優(yōu)化器將in轉(zhuǎn)換為exists子查詢,且這些自查徐你可以使用到主鍵進(jìn)行等值匹配才可以。如explain select * from table1
where field in (select id from table2 where talbe1.fieldn = 'string') or field2 = 'string' - index_subquery:使用子查詢的結(jié)果作為索引來(lái)訪問(wèn)另一個(gè)表。
possible_keys
根據(jù)where/group by修飾的字段,可能使用的索引,并不保證實(shí)際執(zhí)行時(shí)一定會(huì)使用這些索引,可以有多個(gè)。
key
表示實(shí)際選擇的索引。
keylen
索引字段的最大長(zhǎng)度,單位字節(jié),值越大越好,主要對(duì)于聯(lián)合索引有參考意義。
注意這里的越大越好,是跟當(dāng)前字段的情況比較,如int類型占4個(gè)字節(jié),顯示4或者5(包含null)就很好。如果是varchar(100),則顯示400,或403(utf8mb4+null+記錄長(zhǎng)度的字節(jié) ==> 100 * 4 + 1 + 2,如果字段不為null,則省掉一個(gè)字節(jié)),比顯示260更好。
ref
索引列做等值查詢時(shí),與索引列進(jìn)行等值匹配的對(duì)象信息,對(duì)性能優(yōu)化參考意義不大。
例如等值匹配到了,返回const。
rows
預(yù)估本次查詢要掃描的行數(shù),值越小越好,小了代表范圍精準(zhǔn),進(jìn)而實(shí)現(xiàn)快速查找。
filtered
該filtered列指示按表?xiàng)l件過(guò)濾的表行的估計(jì)百分比。越大越好。最大值為 100,這意味著沒(méi)有發(fā)生行過(guò)濾。
從 100 開(kāi)始遞減的值表示過(guò)濾量的增加。。例如如果 rows為 1000, filtered為 50.00 (50%),則與下表連接的行數(shù)為 1000 × 50% = 500。
Extra
用于備注補(bǔ)充。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837791.html
- Using temporary:表示SQL使用union創(chuàng)建的臨時(shí)表所在行。
- Using index 表示查詢使用了覆蓋索引,即只使用了索引而沒(méi)有訪問(wèn)實(shí)際的數(shù)據(jù)行,這通常發(fā)生在查詢條件中包含了索引覆蓋的所有列。
- Using where 表示查詢使用了 WHERE 子句過(guò)濾數(shù)據(jù)。
- Using temporary 表示查詢需要?jiǎng)?chuàng)建臨時(shí)表來(lái)處理結(jié)果集,這可能發(fā)生在使用了臨時(shí)表進(jìn)行排序操作或者連接操作時(shí)。
- Using filesort 表示查詢需要對(duì)結(jié)果集進(jìn)行文件排序操作,這通常發(fā)生在無(wú)法使用索引完成排序時(shí)。
- Using join buffer 表示查詢使用了連接緩沖區(qū)來(lái)處理連接操作。
- Impossible WHERE 表示 WHERE 子句的條件總是為 false,因此查詢將返回空結(jié)果集。
- Select tables optimized away表示由于某些優(yōu)化,查詢將跳過(guò)不必要的表訪問(wèn)。
- Full table scan 表示查詢將對(duì)整個(gè)表進(jìn)行全表掃描,沒(méi)有使用任何索引。
- Using index condition:表示使用了索引下推。
- Using index for group-by:表示查詢使用了索引進(jìn)行分組操作。
- Using index for order by:表示查詢使用了索引進(jìn)行排序操作。
- Using index for distinct 表示查詢使用了索引進(jìn)行去重操作。
- Using index for limit:表示查詢使用了索引來(lái)執(zhí)行 LIMIT 操作。
- Using index for merge:表示查詢使用了索引合并進(jìn)行連接操作。
- Using where with pushed condition:表示查詢的 WHERE 條件中的部分條件被推遲執(zhí)行。
- Loose index scan: 表示在一些情況下,MySQL 可能對(duì)索引的列進(jìn)行寬松掃描,而不是精確匹配。
- Range checked for each record: 表示對(duì)于每個(gè)匹配的記錄,都需要進(jìn)一步檢查范圍條件。
- Using index for LIKE: 表示使用索引執(zhí)行了 LIKE 查詢。
- Distinct: 表示在處理查詢數(shù)據(jù)時(shí)會(huì)進(jìn)行去重操作。
- Order by: 表示查詢需要進(jìn)行排序操作。
- Table is marked as crashed and should be repaired: 表示表已標(biāo)記為損壞,需要修復(fù)。
- No tables used: 表示查詢使用了某種優(yōu)化方式,無(wú)需訪問(wèn)任何表。
- Range checked for each record (index map: N): 和 Range checked for each record 類似,但額外說(shuō)明了哪個(gè)表進(jìn)行了進(jìn)一步的范圍檢查。
擴(kuò)展
explain 支持使用原生SQL進(jìn)行json格式輸出,用法explain format=json sql...。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837791.html
到了這里,關(guān)于MySQL explain的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!