1. 程式人生 > 其它 >利用EXPLAIN對分析SQL語句的效能

利用EXPLAIN對分析SQL語句的效能

技術標籤:mysqlmysql索引

使用EXPLAIN關鍵字可以模擬優化器執行sql語句,從而看到sql的執行過程,分析sql的查詢或者表結構的效能瓶頸。

EXPLAIN如何使用?

  • 格式:EXPLAIN SQL語句
EXPLAIN SELECT * FROM t1;
  • 執行結果

在這裡插入圖片描述

EXPLAIN欄位含義:

  • id:select查詢的序列號,表示查詢或者子查詢操作表的順序。id越大越優先執行。
EXPLAIN SELECT t1.id FROM t1 WHERE t1.id IN
	(SELECT t2.id FROM t2 WHERE t2.id IN
           (SELECT
t3.id FROM t3 WHERE t3.content = '') );

在這裡插入圖片描述
正常來說,子查詢的順序應該是在外層查詢之前的,也就是說操作t3表的sql的id應該大於操作t1表的id才對。但是在mysql5.7的版本中,優化器右在內部做了優化,id顯示的都是1,表示同步執行。

  • select type:區別普通查詢、連線查詢、子查詢等複雜查詢。
-- 普通查詢,其中SIMPLE表示普通查詢
EXPLAIN select * from t1 ;

在這裡插入圖片描述

-- where子句包含子查詢,其中PRIMARY用來表示外層查詢
-- SUBQUERY表示where子句包含了子查詢
EXPLAIN
select t2.id from t2 where t2.id = ( select t3.id from t3 where t3.id = 1);

在這裡插入圖片描述

  • type:查詢的訪問型別,比較重要的指標。從好到壞依次是:
    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
    一般來說,sql至少保證達到range級別,最好能達到ref。
-- eq_ref:唯一索引掃描。對於每個索引鍵,表中只有一條記錄與之匹配。
-- 比如:id
EXPLAIN SELECT * FROM t1 ,t2 WHERE t1.id = t2.id ;

主表全盤掃描,從表按索引掃描

-- ref:返回可以匹配某一列某個值的所有行。
CREATE INDEX idx_t2_content ON t2(content);
EXPLAIN SELECT * FROM t1 ,t2 WHERE t1.content = t2.content;

在這裡插入圖片描述

-- range:只檢索某個範圍內的資料。key列顯示的就是使用的什麼索引。
EXPLAIN select * from t1 where t1.id >10 ;

在這裡插入圖片描述

-- index:有索引但是沒有使用索引進行過濾
EXPLAIN select id from t1;

在這裡插入圖片描述

-- all:全盤掃描
EXPLAIN SELECT * FROM t1 ;

在這裡插入圖片描述

  • key:實際使用的索引。
  • key_len:索引中使用的位元組數。key_len越長,表示索引使用的越充分。
  • ref:顯示索引的哪一列被使用了。
CREATE INDEX idx_name_t_emp ON t_emp(NAME);
EXPLAIN SELECT * FROM t_emp emp ,t_dept dept  WHERE emp.name = 'aaa' AND emp.deptId = dept.id ;

在這裡插入圖片描述

  • rows:執行查詢時可能要查詢的行數(不精確),越少越好。