MySQL使用EXPLAIN分析SQL

2021-08-11 07:28:35 字數 3192 閱讀 1270

explain 關鍵字詳解

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

使用explain 關鍵字可以讓我們知道表的讀取順序、資料讀寫操作的操作型別、哪些索引是可以使用的、哪些索引是實際使用的、表之間的引用、每張表有哪些行被mysql優化器查詢。其基本的使用語法是explain + sql 語句。

在這裡我使用explain 關鍵字執行了一條sql 語句

explain select * from t_dept where dept_id = (select dept_id from t_emp where emp_id=177);
下面是執行該語句所輸出的結果:

我們可以看出查詢結果包含了很多字段,下面我們就來了解一下這些欄位都是什麼意思。

explain 字段詳解

id:select 查詢的序列號,表示查詢中執行的select 子句或操作表的順序,id 表現的形式有三種:

1]:id相同,執行順序由上至下。

2]:id 不同,如果是子查詢,id 的序號會遞增,id 的值越大優先順序越高,越先被執行。

3]:id 既有相同的又有不同的,即id 值越大的優先被執行,如果存在id 相同的,則在上面的執行順序高於在下面的。

所以mysql對於我們編寫的sql 語句並不是按照我們編寫的順序執行,這一點與我們的四則運算順序相類似,並不是在最前面的運算先執行,要考慮運算子與括號的問題。

select_type:首先select_type 有好幾種,表示查詢的型別,主要用於區別普通查詢,聯合查詢,子查詢等複雜查詢。下面逐一介紹:

select_type

介紹******

簡單的select 查詢,查詢中不包括子查詢或者union

primary

查詢中若包含任何複雜的子查詢,最外層的查詢會被標記為primary

subquery

在select 或 where 列表中包含的子查詢部分(可以參照上面查詢的結果)

derived

在from 列表中包含的子查詢被標記為derived (衍生),mysql會遞迴執行這些子查詢,把結果放在臨時表裡

union

若第二個select 出現在union 之後,就會被標記為union,若union 包含在from 字句的子查詢中,外層的select 將被標記為:derived

union result

從union 表中獲取結果的 select

table:表示這一行資料關聯的資料表。

partitions:表示給定表所使用的分割槽。

type:表示查詢語句的連線型別。type 也有很多種,下面做具體介紹:

type

介紹system

表只有一行(相當於系統表),這是const 型別的特例,一般很少出現

const

表示通過索引一次就可以查詢到資料,用於比較primary key 或者unique 索引。如果將主鍵置於where 條件中,mysql就將該查詢轉換位乙個常量

eq_ref

唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄相匹配,常用於主鍵或唯一索引掃瞄

ref

非唯一性索引掃瞄,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,返回的是所有匹配某個單獨之的行,屬於查詢和掃瞄的混合體

range

只檢索給定範圍的行,使用乙個索引來選擇行。比如在where 語句中出現的between 、in 等的查詢。這種索引的掃瞄範圍比全表掃瞄要好

index

所有索引掃瞄,index 與all 的最大區別是index 型別只掃瞄索引樹。這通常比all 塊,因為索引檔案通常比資料檔案要小

all遍歷全表找到匹配的行(是從磁碟中讀取資料)

type 的型別不止上面的幾種,這裡只列出了比較常見的幾種型別, 根據上面的介紹我們總結出從出現的最好到最差的順序是:system > const > eq_ref > ref > range > index > all ,但是對於一般來說,能夠保證達到range 級別就可以了,最好達到ref 級別。

possible_keys: 表示在這張表可能會使用的索引,乙個或多個,只是可能會使用,但是不表示一定被實際使用。

key:實際上使用的索引。可以為null 表示沒有使用索引。

key_len:表示索引中的位元組數,可以通過該列計算查詢中使用的索引的長度。在不失精度的情況下,長度越短越好。key_len 顯示的值為索引欄位的最大可能長度,並非實際長度,是根據表定義計算得出。

ref:顯示索引的哪一列被使用了,一般是乙個常數。

rows:根據表統計資訊及選取索引的情況,大致估算出查到記錄所需要讀取的行數。

filtered:filtered列給出了乙個百分比的值,這個百分比值和rows列的值一起使用,可以估計出那些將要和qep中的前乙個表進行連線的行的數目。

extra:包含不適合在其他列中顯示但是也十分重要的額外資訊:

type

介紹using filesort

說明mysql會對資料使用乙個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql無法利用索引完成的排序操作被稱為「檔案排序」。這種情況是極其糟糕的

using temporary

使用了臨時表儲存中間結果,mysql在對查詢結果排序時使用臨時表, 主要是order by 和分組查詢。這種情況的出現也是極其糟糕的

using index

表示相應的查詢字段覆蓋了索引,避免了訪問表的資料行,效率很高。

using where

表示使用了where 進行過濾

using join where

表示使用了連線快取

impossible where

表示where 子句的值永遠為false ,不能用來獲取資料

distinct

優化distinct 操作,表示在找到第一匹配的元組後就停止找同樣的值

Mysql中使用explain進行效能分析

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。先解析一條sql語句,看出現什麼內容 select識別符。這是select查詢序列號。查詢序號代表sql語句執行的順序,看下面這條sql explainselect from s...

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...