《MYSQL之explain詳解》要點:
本文介紹了MYSQL之explain詳解,希望對您有用。如果有疑問,可以聯系我們。
總所周知,MYSQL的explain是用于SQL語句的查詢執行計劃(QEP),通過這個命令可以讓我們清楚的了解MYSQL是如何執行SQL語句,從而我們可以更好地進行SQL的語句優化和索引優化.但是往往很多新人對explain輸出的各字段含義不慎了解,下面我們就針對這些參數做一下詳細的解釋,希望能給到各位幫助.
explain參數詳解
1)id 查詢序列號,如果一條語句中包含多個SQL子句的話,此id代表SQL執行的先后順序.
2)select_type 查詢的類型,主要是區別普通查詢和聯合查詢、子查詢之類的復雜查詢
simple 它表示簡單的select,沒有union和子查詢
primary 查詢中最外層的SELECT(如兩表做UNION或者存在子查詢的外層的表操作為PRIMARY,內層的操作為UNION)
union 使用了union的聯合語句
其他參數比較少用到,這些就不說明了.
3)table 查詢的表
3)type 連接類型
system 表僅有一行,這是const類型的特列
const 表最多有一個匹配行,一般出現在查詢使用了primary key 或者unique索引.
eq_ref 比較帶索引的列,它用在一個索引的所有部分被聯接使用并且索引是UNIQUE或PRIMARY KEY.
ref 使用了非唯一索引(操作符必須是“=”,值不可為NULL)做掃描
fulltext 全文索引
ref_or_null 類似ref,只是搜索條件包括:連接字段的值可以為null的情況,比如 where col = 2 or col is null
index_merge 使用了索引合并優化辦法.在這種情況下,key列包含了使用的索引的清單,key_len包含了使用的索引的最長的關鍵元素.
unique_subquery 在子查詢中,基于唯一索引進行掃描,類似于eq_ref
index_subquery 在子查詢中,基于除唯一索引之外的索引進行掃描
range 范圍掃描,基于索引做范圍掃描,為諸如between,in,>=,like類操作提供支持
index 該聯接類型與ALL相同,除了只有索引樹被掃描.這通常比all快,因為索引文件通常比數據文件小.(也就是說雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬盤中讀的)
all 全表掃描或者范圍掃描:不使用索引,順序掃描,直接讀取表上的數據
備注:連接類型是一個非常重要的查詢性能指標,從好到壞依次為:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
如果在生產環境中,特別是存儲數據達上百萬以上的表,至少得保證查詢至少達到range級別,最好能達到ref.
3)possible_keys 提示使用哪個索引會在該表中找到行,只是一種可能的預估,不代表實際的查詢執行計劃.
4)keys MYSQL使用的索引,簡單且重要
5)key_len MYSQL使用的索引長度
6)ref ref列顯示使用哪個列或常數與key一起從表中選擇行.
7)rows 顯示MYSQL執行查詢的行數,簡單且重要,數值越大越不好,說明沒有用好索引
8)Extra 該列包含MySQL辦理查詢的詳細信息.
distinct MySQL發現第1個匹配行后,停止為當前的行組合搜索更多的行.
range checked for each record 沒有找到合適的索引
using filesort MYSQL手冊是這么解釋的“MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行.通過根據聯接類型瀏覽所有行并為所有匹配WHERE子句的行保存排序關鍵字和行的指針來完成排序. 然后關鍵字被排序,并按排序順序檢索行.
using index 只使用索引樹中的信息而不需要進一步搜索讀取實際的行來檢索表中的信息.這個比較容易理解,就是說明是否使用了索引
using temporary 為了辦理查詢,MySQL需要創建一個臨時表來容納結果.典型情況如查詢包含可以按不同情況列出列的GROUP BY和ORDER BY子句時.
歡迎參與《MYSQL之explain詳解》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7167.html