Mysql語句效能分析 EXPLAIN

2021-10-03 09:44:50 字數 3153 閱讀 6756

使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。

如下面sql語句:

explain

select

*from system_area where

status

=1

******:簡單表,不使用表連線或子查詢

primary:主查詢,即外層的查詢

union:union中的第二個或者後面的查詢語句

顯示來自哪一張表

匹配的分割槽,如果查詢是基於分割槽表的話,會顯示查詢將訪問的分割槽

注意:在5.7以前的版本中,想要顯示partitions需要使用explain partitions命令;想要顯示filtered需要使用explain extended命令。在5.7版本後,預設explain直接顯示partitions和filtered中的資訊。

system:表中只有一行資料或者是空表,且只能用於myisam和memory表。如果是innodb引擎表,type列在這個情況通常都是all或者index

const:使用唯一索引或者主鍵,返回記錄一定是1行記錄的等值where條件時,通常type是const。其他資料庫也叫做唯一索引掃瞄

eq_ref:出現在要連線過個表的查詢計畫中,驅動表只返回一行資料,且這行資料是第二個表的主鍵或者唯一索引,且必須為not null,唯一索引和主鍵是多列時,只有所有的列都用作比較時才會出現eq_ref

ref:不像eq_ref那樣要求連線順序,也沒有主鍵和唯一索引的要求,只要使用相等條件檢索時就可能出現,常見與輔助索引的等值查詢。或者多列主鍵、唯一索引中,使用第乙個列之外的列作為等值查詢也會出現,總之,返回資料不唯一的等值查詢就可能出現。

fulltext:全文索引檢索,要注意,全文索引的優先順序很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引

ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多。

index_merge:表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之後,但是實際上由於要讀取所個索引,效能可能大部分時間都不如range

unique_subquery:用於where中的in形式子查詢,子查詢返回不重複值唯一值

index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值,可以使用索引將子查詢去重。

range:索引範圍掃瞄,常見於使用 =, <>, >, >=, <, <=, is null, <=>, between, in()或者like等運算子的查詢中。

index:索引全表掃瞄,把索引從頭到尾掃一遍,常見於使用索引列就可以處理不需要讀取資料檔案的查詢、可以使用索引排序或者分組的查詢。一種是查詢使用了覆蓋索引,那麼它只需要掃瞄索引就可以獲得資料,這個效率要比全表掃瞄要快,因為索引通常比資料表小,而且還能避免二次查詢。在extra中顯示using index,反之,如果在索引上進行全表掃瞄,沒有using index的提示。

all:這個就是全表掃瞄資料檔案,然後再在server層進行過濾返回符合要求的記錄。

顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。

實際使用的索引。如果為null,則沒有使用索引。

使用的索引的長度。在不損失精確性的情況下,長度越短越好。

顯示索引的哪一列被使用了,如果可能的話,是乙個常數

mysql認為必須檢查的用來返回請求資料的行數

mysql 5.7預設就會輸出filtered,它指返回結果的行佔需要讀到的行(rows列的值)的百分比

distinct:在select部分使用了distinc關鍵字

no tables used:不帶from字句的查詢或者from dual查詢

使用not in()形式子查詢或not exists運算子的連線查詢,這種叫做反連線。即,一般連線查詢是先查詢內錶,再查詢外表,反連線就是先查詢外表,再查詢內錶。

using filesort:說明mysql會對資料使用乙個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為「檔案排序」。常見於order by和group by語句中

using index:表示相應的select操作中使用了覆蓋索引,避免訪問了表的資料行,效率不錯。如果同時出現using where,表明索引被用來執行索引鍵值的查詢;如果沒有同時出現using where,表明索引用來讀取資料而非執行查詢動作。

using join buffer(block nested loop),using join buffer(batched key accss):5.6.x之後的版本優化關聯查詢的bnl,bka特性。主要是減少內錶的迴圈數量以及比較順序地掃瞄查詢。

using sort_union,using_union,using intersect,using sort_intersection:

using intersect:表示使用and的各個索引的條件時,該資訊表示是從處理結果獲取交集

using union:表示使用or連線各個使用索引的條件時,該資訊表示從處理結果獲取並集

using sort_union和using sort_intersection:與前面兩個對應的類似,只是他們是出現在用and和or查詢資訊量大時,先查詢主鍵,然後進行排序合併後,才能讀取記錄並返回。

using temporary:使用了用臨時表儲存中間結果,mysql在對查詢結果排序時使用臨時表。常見於排序order by和分組查詢group by。

using where:表示儲存引擎返回的記錄並不是所有的都滿足查詢條件,需要在server層進行過濾。查詢條件中分為限制條件和檢查條件,5.6之前,儲存引擎只能根據限制條件掃瞄資料並返回,然後server層根據檢查條件進行過濾再返回真正符合查詢的資料。5.6.x之後支援icp特性,可以把檢查條件也下推到儲存引擎層,不符合檢查條件和限制條件的資料,直接不讀取,這樣就大大減少了儲存引擎掃瞄的記錄數量。extra列顯示using index condition

firstmatch(tb_name):5.6.x開始引入的優化子查詢的新特性之一,常見於where字句含有in()型別的子查詢。如果內錶的資料量比較大,就可能出現這個

loosescan(m…n):5.6.x之後引入的優化子查詢的新特性之一,在in()型別的子查詢中,子查詢返回的可能有重覆記錄時,就可能出現這個

mysql 語句 效能 mysql語句效能分析

id id列數字越大越先執行,id列為null的就表是這是乙個結果集 select type 表示不需要union操作或者不包含子查詢的簡單select查詢。有連線查詢時,外層的查詢為 且只有乙個 primary 乙個需要union操作或者含有子查詢的select,位於最外層的單位查詢的select...

Mysql語句 explain命令效能分析

在工作中,我們需要對select語句進行優化,以便節約資源與效能,提公升查詢速度。但是,我們應該怎麼查詢乙個sql語句的效能呢?這裡記錄一種mysql自帶的效能查詢命令 explain。部落格主要參照 的命令詳解 一般情況下使用explain命令格式為 explain select from whe...

mysql 效能分析 Mysql效能分析

優化mysql資料庫效能的十個引數 1 max connections 允許的同時客戶的數量。增加該值增加 mysqld 要求的檔案描述符的數量。這個數字應該增加,否則,你將經常看到 too many connections 錯誤。預設數值是100,我把它改為1024 2 record buffer...