一、 如何檢視mysql執行計劃?
示例:explain SELECT * FROM tableName;
執行結果如下:
引數說明:
1、id:SELECT的查詢序列號:
2、select_type:select的型別,有以下幾種形式:
SIMPLE:簡單SELECT(不使用UNION或子查詢等)
PRIMARY:最外面的SELECT:
UNION:UNION中的第二個或後面的SELECT語句
DEPENDENT UNION:UNION中的第二個或後面的SELECT語句,取決於外面的查詢
UNION RESULT:UNION的結果。
SUBQUERY:子查詢中的第一個SELECT
DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決於外面的查詢
DERIVED:匯出表的SELECT(FROM子句的子查詢)
3、table:表名
4、type:連線使用了哪種類別,有無使用索引,type分類如下:
system:表只有一行;
const:表最多隻有一行匹配,通用用於主鍵或者唯一索引比較時;
eq_ref:唯一性索引掃描,對於每個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或唯一索引掃描
ref:非唯一性索引掃描,返回匹配某個單獨值得所有行;
fulltext:全文搜尋
ref_or_null:與ref類似,但包括NULL;
index_merge:索引合併優化,但不包括跨表和全文索引;
unique_subquery:用於where中的in形式子查詢,子查詢返回不重複值唯一值;
index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值;
range:只檢索給定範圍的行;
index:讀全表,index只遍歷索引樹;
ALL:表示全表掃描。
效能由好到壞排序:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL;
5、possible_keys:顯示可能應用在表中的索引,possible_keys的值一個或多個
6、key:實際使用到的索引;
7、key_len:索引中使用到的位元組數,長度越短越好;
8、ref:顯示索引的哪一列被使用了;9、rows:根據表統計資訊及索引選用情況,找到所需要讀取的行數;
9、filtered:返回結果的行佔需要讀到的行(rows列的值)的百分比;
10、Extra:包含不適合在其它列中顯示但十分重要的額外資訊。
二、執行計劃的限制
1、無法展示儲存過程,觸發器,UDF對查詢的影響
2、無法使用EXPLAIN對儲存過程進行分析