前言:這篇文章主要講 explain 如何使用,還有 explain 各類參數概念,以後會講優化程序員
1、Explain 用法
模擬Mysql優化器是如何執行SQL查詢語句的,從而知道Mysql是如何處理你的SQL語句的。分析你的查詢語句或是表結構的性能瓶頸。web
語法:Explain + SQL 語句;spring
如:Explain select * from user; 會生成以下 SQL 分析結果,下面詳細對每一個字段進行詳解sql
2、id
是一組數字,表明多個表之間的查詢順序,或者包含子句查詢語句中的順序,id 總共分爲三種狀況,依次詳解數據庫
-
id 相同,執行順序由上至下緩存
-
id 不一樣,若是是子查詢,id 號會遞增,id 值越大優先級越高,越先被執行微信
-
id 相同和不一樣的狀況同時存在性能
3、select_type
select_type 包含如下幾種值學習
-
simple優化
-
primary
-
subquery
-
derived
-
union
-
union result
simple
簡單的 select 查詢,查詢中不包含子查詢或者 union 查詢
primary
若是 SQL 語句中包含任何子查詢,那麼子查詢的最外層會被標記爲 primary
subquery
在 select 或者 where 裏包含了子查詢,那麼子查詢就會被標記爲 subQquery,同三.二同時出現
derived
在 from 中包含的子查詢,會被標記爲衍生查詢,會把查詢結果放到一個臨時表中
union / union result
若是有兩個 select 查詢語句,他們之間用 union 連起來查詢,那麼第二個 select 會被標記爲 union,union 的結果被標記爲 union result。它的 id 是爲 null 的
4、table
表示這一行的數據是哪張表的數據
5、type
type 是表明 MySQL 使用了哪一種索引類型,不一樣的索引類型的查詢效率也是不同的,type 大體有如下種類
-
system
-
const
-
eq_ref
-
ref
-
range
-
index
-
all
system
表中只有一行記錄,system 是 const 的特例,幾乎不會出現這種狀況,能夠忽略不計
const
將主鍵索引或者惟一索引放到 where 條件中查詢,MySQL 能夠將查詢條件轉變成一個常量,只匹配一行數據,索引一次就找到數據了
eq_ref
在多表查詢中,如 T1 和 T2,T1 中的一行記錄,在 T2 中也只能找到惟一的一行,說白了就是 T1 和 T2 關聯查詢的條件都是主鍵索引或者惟一索引,這樣才能保證 T1 每一行記錄只對應 T2 的一行記錄
舉個不太恰當的例子,EXPLAIN SELECT * from t1 , t2 where t1.id = t2.id
ref
不是主鍵索引,也不是惟一索引,就是普通的索引,可能會返回多個符合條件的行。
range
體如今對某個索引進行區間範圍檢索,通常出如今 where 條件中的 between、and、<、>、in 等範圍查找中。
index
將全部的索引樹都遍歷一遍,查找到符合條件的行。索引文件比數據文件仍是要小不少,因此比不用索引全表掃描仍是要快不少。
all
沒用到索引,單純的將表數據所有都遍歷一遍,查找到符合條件的數據
6、possible_keys
這次查詢中涉及字段上若存在索引,則會被列出來,表示可能會用到的索引,但並非實際上必定會用到的索引
7、key
這次查詢中實際上用到的索引
8、key_len
表示索引中使用的字節數,經過該屬性能夠知道在查詢中使用的索引長度,注意:這個長度是最大可能長度,並不是實際使用長度,在不損失精確性的狀況下,長度越短查詢效率越高
9、ref
顯示關聯的字段。若是使用常數等值查詢,則顯示 const,若是是鏈接查詢,則會顯示關聯的字段。
-
tb_emp 表爲非惟一性索引掃描,實際使用的索引列爲 idx_name,因爲 tb_emp.name='rose'爲一個常量,因此 ref=const。
-
tb_dept 爲惟一索引掃描,從 sql 語句能夠看出,實際使用了 PRIMARY 主鍵索引,ref=db01.tb_emp.deptid 表示關聯了 db01 數據庫中 tb_emp 表的 deptid 字段。
10、rows
根據表信息統計以及索引的使用狀況,大體估算說要找到所需記錄須要讀取的行數,rows 越小越好
11、extra
不適合在其餘列顯示出來,但在優化時十分重要的信息
using fileSort(重點優化)
俗稱 " 文件排序 " ,在數據量大的時候幾乎是「九死一輩子」,在 order by 或者在 group by 排序的過程當中,order by 的字段不是索引字段,或者 select 查詢字段存在不是索引字段,或者 select 查詢字段都是索引字段,可是 order by 字段和 select 索引字段的順序不一致,都會致使 fileSort
using temporary(重點優化)
使用了臨時表保存中間結果,常見於 order by 和 group by 中。
USING index(重點)
表示相應的 select 操做中使用了覆蓋索引(Coveing Index),避免訪問了表的數據行,效率不錯! 若是同時出現 using where,代表索引被用來執行索引鍵值的查找;若是沒有同時出現 using where,表面索引用來讀取數據而非執行查找動做。
Using wher
代表使用了 where 過濾
using join buffer
使用了鏈接緩存
impossible where
where 子句的值老是 false,不能用來獲取任何元組
select tables optimized away
在沒有 GROUPBY 子句的狀況下,基於索引優化 MIN/MAX 操做或者 對於 MyISAM 存儲引擎優化 COUNT(*)操做,沒必要等到執行階段再進行計算, 查詢執行計劃生成的階段即完成優化。
distinct
優化 distinct,在找到第一匹配的元組後即中止找一樣值的工做
下篇文章講講如何優化 MySQL 索引
關注微信公衆號:IT 老哥
回覆:Java 全套教程,便可領取:Java 基礎、Java web、JavaEE 所有的教程,包括 spring boot 等
回覆:簡歷模板,便可獲取 100 份精美簡歷
回覆:Java 學習路線,便可獲取最新最全的一份學習路線圖
回覆:Java 電子書,便可領取 13 本頂級程序員必讀書籍