explain關鍵字能夠模擬MySQL優化器執行SQL語句,能夠很好的分析SQL語句或表結構的性能瓶頸。mysql
1. 表的讀取順序如何sql
2. 數據讀取操做有哪些操做類型緩存
3. 哪些索引可使用markdown
4. 哪些索引被實際使用性能
5. 表之間是如何引用優化
6. 每張表有多少行被優化器查詢ui
mysql> explain select * from subject where id = 1 \G
spa****************************************************** 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 ******************************************************
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 //包含不適合在其它列中顯示但十分重要的額外信息
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
常見的十種類型: 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,將遍歷全表以找到匹配行
數據來自哪張表
顯示可能應用在這張表中的索引,一個或多個 查詢涉及到的字段若存在索引,則該索引將被列出,但不必定被實際使用
實際使用到的索引,若是爲NULL,則沒有使用索引 查詢中若使用了覆蓋索引(查詢的列恰好是索引),則該索引僅出如今key列表。
表示索引中使用的字節數,可經過該列計算查詢中使用的索引的長度 在不損失精確度的狀況下,長度越短越好
key_len顯示的值爲索引字段最大的可能長度,並不是實際使用長度 即key_len是根據定義計算而得,不是經過表內檢索出的
顯示索引的哪一列被使用了,若是可能的話,是一個常數,哪些列或常量被用於查找索引列上的值
根據表統計信息及索引選用狀況,大體估算出找到所需的記錄所需讀取的行數
匹配的分區
查詢的錶行佔表的百分比
包含不適合在其它列中顯示但十分重要的額外信息
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根本沒有遍歷表或索引就返回數據了