Mysql執行計劃

**執行計劃是sql語句的具體執行過程,使用explain+sql語句來模擬優化器執行sql查詢語句。官網地址html

執行計劃中包含的信息

image

1.id

select查詢的序列號,包含一組數字,表示查詢中執行select語句的順序,id號分爲三種狀況:mysql

1.若是id號相同,那麼執行順序從上到下。
2.若是id不一樣,id值越大優先級越高,越先被執行。
3.同時存在id值相同和不一樣的,相同的能夠認爲是一組,從上往下順序執行,在全部組中,id值越大,優先級越高,越先執行。

2.select_type

主要用來分辨查詢的類型,是普通查詢仍是聯合查詢仍是子查詢。
image.png算法

simple:簡單的查詢,不包含子查詢和union
primary:查詢中若包任何複雜的子查詢,最外層查詢被標記爲primary
union:若第二個select出如今union以後,則被標記爲union
dependent union:跟union相似,此處的depentent表示union或union all聯合而成的結果會受外部表影響
subquery:在select或者where後面包含子查詢
dependent subquery:subquery的子查詢受外部表影響
union result:從union表獲取結果的select
derived:rom子句中出現的子查詢,也叫作衍生表
UNCACHEABLE SUBQUERY:表示使用子查詢的結果不能被緩存
uncacheable union:表示union的查詢結果不能被緩存

3.table

對應行正在訪問哪個表,表名或者別名,多是臨時表或者union合併結果集。
一、若是是具體的表名,則代表從實際的物理表中獲取數據,固然也能夠是表的別名
二、表名是derivedN的形式,表示使用了id爲N的查詢產生的衍生表
三、當有union result的時候,表名是union n1,n2等的形式,n1,n2表示參與union的idsql

4.type

type顯示的是訪問類型,訪問類型表示我是以何種方式去訪問咱們的數據訪問的類型有不少,效率從最好到最壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
通常狀況下,得保證查詢至少達到range級別,最好能達到ref。緩存

all:全表掃描,通常狀況下出現這樣的sql語句並且數據量比較大的話那麼就須要進行優化。
index:全索引掃描這個比all的效率要好,主要有兩種狀況,一種是當前的查詢時覆蓋索引,即咱們須要的數據在索引中就能夠索取,或者是使用了索引進行排序,這樣就避免數據的重排序。
range:表示利用索引查詢的時候限制了範圍,在指定範圍內進行查詢,這樣避免了index的全索引掃描,適用的操做符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()。
index_subquery:利用索引來關聯子查詢,再也不掃描全表。
unique_subquery:該鏈接類型相似與index_subquery,使用的是惟一索引。
index_merge:在查詢過程當中須要多個索引組合使用。
ref_or_null:對於某個字段即須要關聯條件,也須要null值的狀況下,查詢優化器會選擇這種訪問方式。
ref:使用了非惟一性索引進行數據的查找。
eq_ref :使用惟一性索引進行數據查找。
const:這個表至多有一個匹配行。
system:表只有一行記錄(等於系統表),這是const類型的特例,平時不會出現。

5.ssible_keys

顯示可能應用在這張表中的索引,一個或多個,查詢涉及到的字段上若存在索引,則該索引將被列出,但不必定被查詢實際使用優化

6.KEY

實際使用的索引,若是爲null,則沒有使用索引,查詢中若使用了覆蓋索引,則該索引和查詢的select字段重疊。spa

7.key_len

表示索引中使用的字節數,能夠經過key_len計算查詢中使用的索引長度,在不損失精度的狀況下長度越短越好。htm

8.ref

顯示索引的哪一列被使用了,若是可能的話,是一個常數blog

9.rows

根據表的統計信息及索引使用狀況,大體估算出找出所需記錄須要讀取的行數,此參數很重要,直接反應的sql找了多少數據,在完成目的的狀況下越少越好排序

10.extra

包含額外的信息。using filesort:說明mysql沒法利用索引進行排序,只能利用排序算法進行排序,會消耗額外的位置explain select * from emp order by sal;using temporary:創建臨時表來保存中間結果,查詢完成以後把臨時表刪除using index:這個表示當前的查詢時覆蓋索引的,直接從索引中讀取數據,而不用訪問數據表。若是同時出現using where 表名索引被用來執行索引鍵值的查找,若是沒有,表面索引被用來讀取數據,而不是真的查找

相關文章
相關標籤/搜索