Mysql中使用explain進行效能分析

2021-08-04 09:25:13 字數 3732 閱讀 4274

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。

先解析一條sql語句,看出現什麼內容

select識別符。這是select查詢序列號。查詢序號代表sql語句執行的順序,看下面這條sql

explainselect*from(select* fromuchome_space limit10)ass
它的執行結果為

可以看到這時的id變化了

2. select_type

select查詢的型別,主要是區別普通查詢和聯合查詢、子查詢之類的複雜查詢,它有以下幾種值:

2.1 ****** 它表示簡單的select,沒有union和子查詢;

2.2 primary 最外面的select,在有子查詢的語句中,最外面的select查詢就是primary;

2.3 union union語句的第二個或者說是後面那乙個select。

現執行一條語句:

explain 

select * from uchome_space limit 10

union

select * from uchome_space limit 10,10

會有如下結果

這裡就是第二條語句使用了union。

2.4 dependent union。union中的第二個或後面的select語句,取決於外面的查詢

2.5 union result 。union的結果,如上面所示。

3. table

輸出的行所引用的表。

4 type

聯合查詢所使用的型別。有多個引數,結果值從好到壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all.一般來說,得保證查詢至少達到range級別,最好能達到ref。先從最佳型別到最差型別介紹:

4.1 system:表僅有一行,這是const型別的特列,平時不會出現,這個也可以忽略不計。

4.2 const:表最多有乙個匹配行,const用於比較primary key 或者unique索引。因為只匹配一行資料,所以很快,記住一定是用到primary key 或者unique,並且只檢索出兩條資料的 情況下才會是const,看下面這條語句。

explain select * from

`asj_admin_log` limit 1,

結果是

explain select * from

`asj_admin_log`

where log_id = 111

log_id是主鍵,所以使用了const。所以說可以理解為const是最優化的

4.3 eq_ref:對於eq_ref的解釋,mysql手冊是這樣說的:」對於每個來自於前面的表的行組合,從該表中讀取一行。這可能是最好的聯接型別,除了const型別。它用在乙個索引的所有部分被聯接使用並且索引是unique或primary key」。eq_ref可以用於使用=比較帶索引的列。

4.4 ref:對於每個來自於前面的表的行組合,所有有匹配索引值的行將從這張表中讀取。如果連線只使用鍵的最左邊的字首,或如果鍵不是unique或primary key(換句話說,如果聯接不能基於關鍵字選擇單個行的話),則使用ref。如果使用的鍵僅僅匹配少量行,該聯接型別是不錯的。

4.5 ref_or_null:該聯接型別如同ref,但是新增了mysql可以專門搜尋包含null值的行。在解決子查詢中經常使用該聯接型別的優化。

上面這五種情況都是很理想的索引使用情況。

4.6 index_merge :該聯接型別表示使用了索引合併優化方法。在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素。

4.7 unique_subquery

4.8 index_subquery

4.9 range 給定範圍內的檢索,使用乙個索引來檢查行。看下面兩條語句

explain select * from uchome_space where uid in (1,2)

explain select * from uchome_space where groupid in (1,2)

uid有索引,groupid沒有索引,結果是第一條語句的聯接型別是range,第二個是all.以為是一定範圍所以說像 between也可以這種聯接,很明顯

explain select * from uchome_space where friendnum = 17
這樣的語句是不會使用range的,它會使用更好的聯接型別就是上面介紹的ref

4.10 index:該聯接型別與all相同,除了只有索引樹被掃瞄。這通常比all快,因為索引檔案通常比資料檔案小。(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬碟中讀的)

當查詢只使用作為單索引一部分的列時,mysql可以使用該聯接型別。

4.11 all :進行完整的表掃瞄,查詢速度最慢。

5 possible_keys 指出mysql能使用哪個索引在該表中找到行。如果是空的,沒有相關的索引。這時要提高效能,可通過檢驗where子句,看是否引用某些字段,或者檢查字段不是適合索引。

6 keys mysql顯示mysql實際決定使用的鍵。如果沒有索引被選擇,鍵是null。

7 key_len mysql示mysql決定使用的鍵長度。如果鍵是null,長度就是null。文件提示特別注意這個值可以得出乙個多重主鍵裡mysql實際使用了哪一部分。

8 ref 顯示哪個欄位或常數與key一起被使用。

9 rows 這個數表示mysql要遍歷多少資料才能找到,在innodb上是不準確的。

10 extra 如果是only index,這意味著資訊只用索引樹中的資訊檢索出的,這比掃瞄整個表要快。如果是where used,就是使用上了where限制。如果是impossible where 表示用不著where,一般就是沒查出來啥。如果此資訊顯示using filesort或者using temporary的話會很吃力,where和order by的索引經常無法兼顧,如果按照where來確定索引,那麼在order by時,就必然會引起using filesort,這就要看是先過濾再排序划算,還是先排序再過濾划算。

MySQL使用EXPLAIN分析SQL

explain 關鍵字詳解 使用explain 關鍵字可以模擬優化器執行sql 查詢語句,從而知道mysql資料庫是如何處理你的sql 語句的。因此我們可以使用該關鍵字知道我們編寫的sql 語句是否是高效的,從而可以提高我們程式猿編寫sql 的能力。使用explain 關鍵字可以讓我們知道表的讀取順...

MySQL中explain使用詳解

一.explain explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和優化查詢語句。二.主要包含的列以及列的含義 1.id select識別符,指第幾個select。id值如果相同,可以認為是一組,從上往下執行 在所有組中,id值越大,優先順序越高,...

MySql的Explain命令使用

mysql的explain命令使用 explain命令是mysql自帶的乙個命令,用於解釋mysql將如何處理sql,執行順序和是否使用了索引之類,我們平常可以用於sql調優。用法則是,在sql前面加上這個命令,比如我們的sql為,select from table 那麼我們使用這個命令則是 exp...