MYSQL?EXPLAIN結(jié)果解讀
MYSQL EXPLAIN結(jié)果解讀
- EXPLAIN不會告訴你關(guān)于觸發(fā)器、存儲過程的信息或用戶自定義函數(shù)對查詢的影響情況。
- EXPLAIN不考慮各種Cache(緩存)。
- EXPLAIN不能顯示MySQL在執(zhí)行查詢時(shí)所作的優(yōu)化工作。部分統(tǒng)計(jì)信息是估算的,并非精確值。
- EXPALIN只能解釋SELECT操作,其他操作要重寫為SELECT后查看執(zhí)行計(jì)劃。
1 id
select的識別符,這是select的查詢序列號。
- 如果有兩列數(shù)據(jù)id相同,則為同一組查詢,由上到下執(zhí)行。
- 如果id值不同,id值越大,優(yōu)先級越高。
2 select_type
select的類型
SIMPLE
(simple):簡單SELECT(不使用UNION或子查詢)。PRIMARY
(primary):子查詢中最外層查詢,查詢中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY。UNION
(union):UNION中的第二個或后面的SELECT語句。DEPENDENT
UNION(dependent union):UNION中的第二個或后面的SELECT語句,取決于外面的查詢。UNION RESULT
(union result):UNION的結(jié)果,union語句中第二個select開始后面所有select。SUBQUERY
(subquery):子查詢中的第一個SELECT,結(jié)果不依賴于外部查詢。DEPENDENT SUBQUERY
(dependent subquery):子查詢中的第一個SELECT,依賴于外部查詢。DERIVED
(derived):派生表的SELECT (FROM子句的子查詢)。UNCACHEABLE SUBQUERY
(uncacheable subquery):(一個子查詢的結(jié)果不能被緩存,必須重新評估外鏈接的第一行)
3 table
- 輸出結(jié)果集的表名稱。
4 partitions
- 輸出結(jié)果集的表所在的分區(qū)
5 TYPE
- type顯示的是訪問類型,是較為重要的一個指標(biāo),結(jié)果值從好到壞依次是:
Null > system > const > eq_ref > ref > ref_or_null> index_merge > unique_subquery > index_subquery > range > index > ALL
一般來說,得保證查詢至少達(dá)到range級別,最好能達(dá)到ref。
我們在進(jìn)行條件查詢時(shí),建議使用索引,否則將引起全表掃描,IO的開銷和程序的性能都沒法保證!
NULL
: MySQL在優(yōu)化過程中分解語句,執(zhí)行時(shí)甚至不用訪問表或索引,例如從一個索引列里選取最小值可以通過單獨(dú)索引查找完成。system
:表僅有一行(=系統(tǒng)表)。這是const聯(lián)接類型的一個特例。當(dāng)MySQL對查詢某部分進(jìn)行優(yōu)化,并轉(zhuǎn)換為一個常量時(shí),使用這些類型( system/const )訪問。如將主鍵置于where列表中,MySQL就能將該查詢轉(zhuǎn)換為一個常量。當(dāng)查詢的表只有一行的情況下,使用system。const
:表最多有一個匹配行,它將在查詢開始時(shí)被讀取。因?yàn)閮H有一行,在這行的列值可被優(yōu)化器剩余部分認(rèn)為是常數(shù)。const表很快,因?yàn)樗鼈冎蛔x取一次!eq_ref
:類似ref,區(qū)別就在使用的索引是唯一索引,對于每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用primary key或者 unique key作為關(guān)聯(lián)條件。這可能是最好的聯(lián)接類型,除了const類型。ref
:表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值。ref_or_null
:該聯(lián)接類型如同ref,但是添加了MySQL可以專門搜索包含NULL值的行。index_merge
:該聯(lián)接類型表示使用了索引合并優(yōu)化方法?!静怀S谩?nbsp;unique_subquery
:該類型替換了下面形式的IN子查詢的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一個索引查找函數(shù),可以完全替換子查詢,效率更高?!静怀S谩?nbsp;index_subquery
:該聯(lián)接類型類似于unique_subquery。可以替換IN子查詢,但只適合下列形式的子查詢中的非唯一索引:value IN (SELECT key_column FROM single_table WHERE some_expr)。【不常用】range
:只檢索給定范圍的行,使用一個索引來選擇行。index
:該聯(lián)接類型與ALL相同,F(xiàn)ull Index Scan,index與ALL區(qū)別為index類型只遍歷索引樹。這通常比ALL快,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小。ALL
:Full Table Scan, MySQL將遍歷全表以找到匹配的行。
6 possible_keys
- 表示查詢時(shí),可能使用的索引。( MySQL能使用哪個索引在該表中找到行)
7 key
- 實(shí)際使用的索引(鍵),必然包含在possible_keys中。如果沒有選擇索引,索引是NULL。
- 要想強(qiáng)制MySQL使用或忽視possible_keys列中的索引,
- 在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
8 key_len
- 索引的長度 ( 使用的字節(jié)數(shù) )。如果索引是NULL,則長度為NULL。
- 不損失精確性的情況下,長度越短越好 。key_len顯示的值為索引字段的最大可能長度,
- 并非實(shí)際使用長度,即key_len是根據(jù)表定義計(jì)算而得,不是通過表內(nèi)檢索出的。
9 ref
- 使用哪個列或常數(shù),與索引一起被用于從表中查找索引列上的值。( 列與索引的比較,表示上述表的連接匹配條件。)
10 rows
- MySQL認(rèn)為它執(zhí)行查詢時(shí)必須檢查的行數(shù)既預(yù)估掃描的行數(shù)。
11 filtered
- 通過表?xiàng)l件過濾出的行數(shù)的百分比估計(jì)值。
12 Extra
Mysql執(zhí)行情況的描述和詳細(xì)說明。
Distinct
:MySQL發(fā)現(xiàn)第1個匹配行后,停止為當(dāng)前的行組合搜索更多的行。Not exists
:MySQL能夠?qū)Σ樵冞M(jìn)行LEFT JOIN優(yōu)化,發(fā)現(xiàn)1個匹配LEFT JOIN標(biāo)準(zhǔn)的行后,不再為前面的的行組合在該表內(nèi)檢查更多的行。range checked for each record
(index map: #):MySQL沒有發(fā)現(xiàn)好的可以使用的索引,但發(fā)現(xiàn)如果來自前面的表的列值已知,可能部分索引可以使用。Using filesort
:當(dāng)Query中包含 order by 操作,而且無法利用索引完成的排序操作稱為“文件排序”。Using index
:只使用索引樹中的信息而不需要進(jìn)一步搜索讀取實(shí)際的行來檢索表中的列信息。Using temporary
:為了解決查詢,MySQL需要創(chuàng)建一個臨時(shí)表來容納結(jié)果集,常見于排序和分組查詢,常見 group by、order by。Using where
:不用讀取表中所有信息,僅通過索引就可以獲取所需數(shù)據(jù),這發(fā)生在對表的全部的請求列都是同一個索引的部分的時(shí)候,表示mysql服務(wù)器將在存儲引擎檢索行后再進(jìn)行過濾。Using sort_union(…)
、Using union(…)
、Using intersect(…)
:這些函數(shù)說明如何為index_merge聯(lián)接類型合并索引掃描。Using index for group-by
:類似于訪問表的Using index方式,Using index for group-by表示MySQL發(fā)現(xiàn)了一個索引,可以用來查詢GROUP BY或DISTINCT查詢的所有列,而不要額外搜索硬盤訪問實(shí)際的表。Using join buffer
:改值強(qiáng)調(diào)了在獲取連接條件時(shí)沒有使用索引,并且需要連接緩沖區(qū)來存儲中間結(jié)果。如果出現(xiàn)了這個值,那應(yīng)該注意,根據(jù)查詢的具體情況可能需要添加索引來改進(jìn)能。Impossible where
:這個值強(qiáng)調(diào)了where語句會導(dǎo)致沒有符合條件的行(通過收集統(tǒng)計(jì)信息不可能存在結(jié)果)。Select tables optimized away
:這個值意味著僅通過使用索引,優(yōu)化器可能僅從聚合函數(shù)結(jié)果中返回一行。No tables used
:Query語句中使用from dual 或不含任何from子句。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入解析mysql中order by與group by的順序問題
本篇文章是對mysql中order by與group by的順序問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06MySQL中將一列以逗號分隔的值行轉(zhuǎn)列的實(shí)現(xiàn)
這篇文章主要介紹了MySQL中將一列以逗號分隔的值行轉(zhuǎn)列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Linux下mysql 8.0.15 安裝配置圖文教程以及修改密碼
這篇文章主要為大家詳細(xì)介紹了Linux下mysql 8.0.15安裝配置圖文教程以及修改密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03Mysql復(fù)制表三種實(shí)現(xiàn)方法及grant解析
這篇文章主要介紹了Mysql復(fù)制表三種實(shí)現(xiàn)方法及grant解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09mysql 如何使用JSON_EXTRACT() 取json值
這篇文章主要介紹了mysql如何使用JSON_EXTRACT() 取json值的操作方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07