[參考文章:http://www.javashuo.com/article/p-kqqfeyzf-ee.html]()mysql
最近在寫sql 的過程當中看到這個關鍵字,以前本身都沒有用過,因此特意看了看,稍微整理了一下。
先放一張使用過程的截圖
下面作詳細的描述sql
UNION :從第二個select出現union 以後,則被標記爲union;若union包含在from 的子查詢中,外層select被標記爲DERIVED
UNION RESULT : 從UNION表中獲取結果的select
三、table
當前執行且輸出結果的表
四、type (al-->index-->range-->ref-->eq_ref-->const,system-->null) 從差到好
(1) all: full table scan 將遍歷全表以找到匹配行
(2) system 表示只有一行記錄,是const的特例,平時不會出現
(3) const 表示經過索引一次就找到了,const用於比較primary key和unique的索引。由於只匹配一行數據,因此很快。好比 將主鍵置於where列表中,mysql 就能將查詢轉換爲一個常量
(4) eq_ref 惟一性索引掃描,對於每一個索引鍵,表中只有一條數據與之相匹配。常見於主鍵或惟一索引
(5) ref 非惟一索引掃描 ,返回匹配某個單獨值的全部行,本質上也是一種索引訪問,他返回全部匹配單獨行的數據,可能找到多個符合條件的行,屬於查找和掃描的混合體
(6) range 只檢索給定範圍的行,使用一個索引來選擇行,key列顯示使用了哪一個索引,通常就是在你的where語句中出現between、<、>、in等查詢,這種範圍掃描索引比全表掃描要好,它只須要開始於索引的一點,結束語於另外一點,不用掃描所有
(7) index (full index scan,index,all 區別爲index類型只遍歷索引樹。)這一般比all快,由於索引文件比數據文件小(也就是說雖然index和all 都是讀全表,但index從索引中讀取,而all從硬盤讀取)
id 是主鍵 ,索引存在主鍵索引
五、possible_keys
顯示是可能使用到的索引,一個或多個。查詢涉及到的字段上若存在索引,則該索引被列出,但不必定被查詢實際使用
六、key
實際使用到的索引,若是爲null 則沒有使用索引(可能緣由是沒有創建索引或索引失效)
查詢中若使用了覆蓋索引(select 後要查詢的字段恰好和建立的索引字段徹底相同),則該索引僅出如今key列表中
緩存
七、key_lenide
表示索引中使用的字節數,可經過該列計算查詢中使用索引的長度,在不損失精確性的狀況下,長度越短越好。key_len顯示的值是索引字段的最大可能長度,並不是實際使用長度,即key_len是根據表定義計算而得,不是表內檢索得出。 ![](https://s4.51cto.com/images/blog/202005/13/cbd9449462c5578a7bad0f04e5830aad.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
八、ref優化
表示索引的那一列被使用了,若是可能的話,最好是一個常數,那些列或常量被用於查找索引列上的值
九、rows.net
根據表統計信息及索引選用狀況,大體估算出找到所需的記錄所須要讀取的行數,用的越少越好
十、extra
包含不適合顯示在其餘列但很重要的額外信息3d
(1)Using filesort 說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中沒法利用索引完成的排序操做稱爲「文件排序」
(2)Using temporary
使用了用臨時表保存中間結果,mysql在對查詢結果排序時使用的時臨時表。常見於排序order by 和分組查詢group by
(3) Using index
表示相應的select操做中使用了覆蓋索引,避免訪問了表的數據行,效率不錯。
若是同時出現Using where,代表索引被用來執行索引鍵值的查找;若是沒有同時出現Using where ,代表索引用來讀取數據而非執行查找動做
覆蓋索引
(4)Using where
表示使用了where 過濾
(5)Using join buffer
表示使用了鏈接緩存,好比在查詢的時候,多表join的次數很是多,那麼將配置文件中的緩衝區的join buffer 調大一些
(6) impossible where
where 子句的值老是false,不能用來獲取任何元組
(7)select tables optimized away
在沒有group by 子句的狀況下,基於索引優化MIN、MAX 操做或者對於MyISAM存儲引擎優化COUNT(*)操做,沒必要等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化
(8)distinct
優化distinct 操做,在找到第一匹配的元組後即中止找一樣值的動做
實例
code