1.explain的作用:
使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。
通過explain 我們可以得到:表的讀取順序(id),資料讀取操作的操作型別(select_type),哪些索引可以被使用(possible_keys),哪些索引實際被使用(key),表之間的引用(type),每張表有多少行被優化器查詢(rows)
explain使用方式,如圖所示
2.執行結果分析
2.1 id
id指的是查詢中執行select子句或操作表的順序,當id一致時,執行順序由上到下,id不一致則是由大到小,即id越大優先順序越高
2.2 select_type
常用的值如下所示:
****** : 指的是簡單的select查詢,且查詢中不包含子查詢和union (注意:where是可以的,where是查詢條件)
primary : 指的是若存在子查詢則最外層查詢就是primary
subquery : 指的是處於select和where中的子查詢語句,注意 不包含from後的
derived : 指的是衍生,在from中的存在子查詢時,子查詢查詢出的結果會存放在一張臨時表中,故被稱為衍生
union : 若第二個select出現在union 之後,則被標記為union :若union 包含在from子句的子查詢中,外層select將被標記為:derived
union result : 從union 表獲取結果的select查詢
2.3 table
指的是當前執行的表,若為derived表時,後面會加上id,指明是由該id的select生成的衍生表;若為union時,會加上兩個id,指明union的是哪兩個id對應的select語句
2.4 type
ype所顯示的是查詢使用了哪種型別,type包含的型別包括如下圖所示的幾種:
這裡寫描述
從最好到最差依次是:system > const > eq_ref > ref > range > index > all
system:表只有一行記錄(等於系統表),這是const型別的特列,平時不會出現,這個也可以忽略不計
const: 表示通過索引一次就找到了,const用於比較primary key 或者unique索引。因為只匹配一行資料,所以很快。如將主鍵置於where列表中,mysql就能將該查詢轉換為乙個常量
eq_ref: 唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常見於主鍵或唯一索引掃瞄
ref: 非唯一性索引掃瞄,返回匹配某個單獨值的所有行,本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,然而,它可能會找到多個符合條件的行,所以他應該屬於查詢和掃瞄的混合體
range: 只檢索給定範圍的行,使用乙個索引來選擇行,key列顯示使用了哪個索引,一般就是在你的where語句**現between、< 、>、in等的查詢,這種範圍掃瞄索引比全表掃瞄要好,因為它只需要開始於索引的某一點,而結束於另一點,不用掃瞄全部索引。
index: full index scan,index與all區別為index型別只遍歷索引樹。這通常比all快,因為索引檔案通常比資料檔案小。(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬碟讀取的)
all: full table scan 將遍歷全表以找到匹配的行 ,也就是沒使用到索引
2.5 possible_keys和key
possible_keys:指的是可能應用在這張表中的索引,乙個或多個。查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢實際使用。
key: 實際使用的索引,如果為null,則沒有使用索引。但查詢中若使用了覆蓋索引(select 後要查詢的字段剛好和建立的索引字段完全相同),則該索引僅出現在key列表中,不會出現在possible_keys列表中
2.6 key_len
表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好。key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據表定義計算而得,不是通過表內檢索出的。
2.7 ref
顯示索引的那一列被使用了,如果可能的話,最好是乙個常數。哪些列或常量被用於查詢索引列上的值。
2.8 rows
根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數,也就是說,用的越少越好
3.例項分析
執行順序1:select_type為union,說明第四個select是union裡的第二個select,最先執行【select name,id from t2】
執行順序2:id為3,是整個查詢中第三個select的一部分。因查詢包含在from中,所以為derived【select id,name from t1 where other_column=」】
執行順序3:select列表中的子查詢select_type為subquery,為整個查詢中的第二個select【select id from t3】
執行順序4:id列為1,表示是union裡的第乙個select,select_type列的primary表示該查詢為外層查詢,table列被標記為,表示查詢結果來自乙個衍生表,其中derived3中的3代表該查詢衍生自第三個select查詢,即id為3的select。【select d1.name ……】
執行順序5:代表從union的臨時表中讀取行的階段,table列的< union1,4 >表示用第乙個和第四個select的結果進行union操作。【兩個結果union操作】
4.除此之外,再簡單提一下索引使用時的最左匹配原則
首先索引存在多種型別:普通索引、唯一索引(允許列值為空)、主鍵索引(不允許列值為空)、組合索引、全文索引
此處講下元件索引建立規則
在執行上述語句時,實際上mysql為表建立了3個索引(user_id),(user_id,vote_id),(user_id,vote_id,group_id)如圖所示
當我們執行如下sql語句時,
通過對比,可以看出此時並第一條語句未走索引進行查詢,而後一條查詢條件由於有了user_id這個組合索引中最左的字段,在查詢時則引用到了索引,這就是最左匹配原則。
到這,有個疑問時,上述查詢條件中將條件位置互換一下是否,還會走索引呢?
檢視執行結果可以得出,查詢條件順序並不影響使用最左原則,具體原因此處就不去分析了,個人猜測可能是在and連線的情況下mysql內部對蓋條語句進行了優化,使其仍匹配最左匹配原則
mysql explain 用法分析
explain select id 選擇識別符號 select type 表示查詢的型別。table 輸出結果集的表 partitions 匹配的分割槽 type 表示表的連線型別 possible keys 表示查詢時,可能使用的索引 key 表示實際使用的索引 key len 索引欄位的長度 r...
Mysql Explain用法詳解
4.explain select type 資料讀取操作的操作型別 5.table 6.type 7.possible keys和key 8.key len 9.ref 10.rows 11.extra 使用方式 explain sql語句 這裡的id不是主鍵,它是一組數字12345這種,表示我們進...
mysql explain用法和結果的含義
詳細可參考 explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在select語句前加上explain就可以了 如 explain select surname,first name form a,b where a.i...