Mysql之explain

簡介

  explain關鍵字能夠模擬MySQL優化器執行SQL語句,能夠很好的分析SQL語句或表結構的性能瓶頸。mysql

explain的用途

1.  表的讀取順序如何sql

2.  數據讀取操做有哪些操做類型緩存

3.  哪些索引可使用markdown

4.  哪些索引被實際使用性能

5. 表之間是如何引用優化

6. 每張表有多少行被優化器查詢ui

explain的執行效果

mysql> explain select * from subject where id = 1 \Gspa

******************************************************  id: 1 select_type: SIMPLE  table: subject partitions: NULL  type: const possible_keys: PRIMARY  key: PRIMARY  key_len: 4  ref: const  rows: 1  filtered: 100.00  Extra: NULL ******************************************************

explain包含的字段

1. id //select查詢的序列號,包含一組數字,表示查詢中執行select子句或操做表的順序 2. select_type //查詢類型 3. table //正在訪問哪一個表 4. partitions //匹配的分區 5. type //訪問的類型 6. possible_keys //顯示可能應用在這張表中的索引,一個或多個,但不必定實際使用到 7. key //實際使用到的索引,若是爲NULL,則沒有使用索引 8. key_len //表示索引中使用的字節數,可經過該列計算查詢中使用的索引的長度 9. ref //顯示索引的哪一列被使用了,若是可能的話,是一個常數,哪些列或常量被用於查找索引列上的值 10. rows //根據表統計信息及索引選用狀況,大體估算出找到所需的記錄所需讀取的行數 11. filtered //查詢的錶行佔表的百分比 12. Extra //包含不適合在其它列中顯示但十分重要的額外信息

圖片版

文字解釋

id字段

1. id相同3d

執行順序從上至下,由於id相同,優先級相同code

讀取順序:subject > teacher > student_score

2. id不一樣

若是有子查詢,id的序號會遞增,id值越大優先級越高,越先被執行。

讀取順序:teacher > subject > student_score

3. id相同又不一樣

id若是相同,能夠認爲是一組,從上往下順序執行 在全部組中,id值越大,優先級越高,越先執行

讀取順序:2.teacher > 2.subject > 1.subject > 1.teacher

select_type最後是union result這是類型是,union兩個表的結果


select_type字段

1. simple

簡單查詢,不包含子查詢或union查詢

2. primary

查詢中若包含任何複雜的子部分,最外層查詢則被標記爲主查詢。下圖select_type中第一個

3. subquery

select或where中包含子查詢,以下圖中select_type中的後兩個subquery。這兩個表是子查詢,因此類型是這個

4. DERIVED

FROM列表中包含的子查詢被標記爲DERIVED(衍生),MySQL 會遞歸執行這些子查詢,把結果放在臨時表中。

注: MySQL5.7+ 進行優化了,增長了derived_merge(派生合併),默認開啓,可加快查詢效率

5. UNION

若第二個select出如今union以後,則被標記爲union。

6. UNION RESULT

從UNION表獲取結果的select


type字段

常見的十種類型:  NULL>system>const>eq_ref>ref>ref_or_null>index_merge>range>index>ALL  最好到最差

1.NULL

 

MySQL可以在優化階段分解查詢語句,在執行階段用不着再訪問表或索引

2. system

表只有一行記錄(等於系統表),這是const類型的特列,平時不大會出現,能夠忽略

3. const

表示經過索引一次就找到了,const用於比較primary key或uique索引,由於只匹配一行數據,因此很快.

如主鍵置於where列表中,MySQL就能將該查詢轉換爲一個常量.

4. eq_ref

惟一性索引掃描,對於每一個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或惟一索引掃描

5. ref

非惟一性索引掃描,返回匹配某個單獨值的全部行

本質上也是一種索引訪問,返回全部匹配某個單獨值的行

然而可能會找到多個符合條件的行,應該屬於查找和掃描的混合體.

6. ref_or_null

相似ref,可是能夠搜索值爲NULL的行

 

7. index_merge

  表示使用了索引合併的優化方法

8. range

只檢索給定範圍的行,使用一個索引來選擇行,key列顯示使用了哪一個索引。

通常就是在你的where語句中出現between、<>、in等的查詢。

結果1和2相同

9. index

Full index Scan,Index與All區別:index只遍歷索引樹,一般比All快

由於索引文件一般比數據文件小,也就是雖然all和index都是讀全表,但index是從索引中讀取的,而all是從硬盤讀的。

10. ALL

Full Table Scan,將遍歷全表以找到匹配行


table字段

  數據來自哪張表

possible_keys字段

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

key字段

  實際使用到的索引,若是爲NULL,則沒有使用索引 查詢中若使用了覆蓋索引(查詢的列恰好是索引),則該索引僅出如今key列表。

key_len字段

  表示索引中使用的字節數,可經過該列計算查詢中使用的索引的長度 在不損失精確度的狀況下,長度越短越好 

  key_len顯示的值爲索引字段最大的可能長度,並不是實際使用長度 即key_len是根據定義計算而得,不是經過表內檢索出的

ref字段

  顯示索引的哪一列被使用了,若是可能的話,是一個常數,哪些列或常量被用於查找索引列上的值

rows字段

  根據表統計信息及索引選用狀況,大體估算出找到所需的記錄所需讀取行數

partitions字段

  匹配的分區

filtered字段

  查詢的錶行佔表的百分比


 

Extra字段

  包含不適合在其它列中顯示但十分重要的額外信息

1. Using filesort

  說明Mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取的。

  Mysql中沒法利用索引完成的排序操做稱爲「文件排序」

 

2. Using temporary

  使用了臨時表保存中間結果,Mysql在對結果排序時使用臨時表。 常見於排序order by 和分組查詢group by

 將union結果使用臨時表存放

3. Using index

表示相應的select操做中使用了覆蓋索引(Covering Index),避免訪問了表的數據行,效率不錯!

若是同時出現using where,代表索引被用來執行索引鍵值的查找 若是沒有同時出現using where,代表索引用來讀取數據而非執行查找動做。

4. Using where

使用了where條件

5. Using join buffer

使用了鏈接緩存

6. impossible where

where子句的值老是false,不能用來獲取任何元組

7. distinct

一旦mysql找到了與行相聯合匹配的行,就再也不搜索了。其實就是使用了distinct

 

8. Select tables optimized away

SELECT操做已經優化到不能再優化了(MySQL根本沒有遍歷表或索引就返回數據了

相關文章
相關標籤/搜索