simple 簡單的select查詢,查詢中不包含子查詢或者union
primary 如果有子查詢,最外層標記為primary
subquery 子查詢
derived 衍生虛表,子查詢會被標記為derived。mysql會遞歸執行這些子查詢,把結果放在臨時表里。
union 若第二個select出現在union之后,則被標記為union。若union包含在from子句的子查詢中,外層select將被標記為derived
union result :從union表獲取結果的select
table 表名
type
從最好到最差依次如下:
system >const> eq_ref > ref > range > index > allsystem :表只有一行記錄(等于系統表),這是const類型的特列。平時不會出現const :表示通過索引一次就找到了,const用于比較primary key 或者unique索引。因為只匹配一行數據。
所以很快。如將主鍵置于where列表中。mysql就能將該查詢轉換為一個常量。eq_ref :唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配。常見于主鍵或者唯一索引掃描。ref :非唯一索引掃描,返回匹配某個單獨值的所有行。本質上也是一種索引訪問,它返回所有匹配某個單獨值的行,所以他應該屬于查找和掃描的混合體。
然而,他可能會找到多個符合條件的行。所以他應該屬于查找和掃描的混合體。range:只檢索給定范圍的行,使用一個索引來選擇行。key列顯示使用了哪個索引。
一般就是在你的where語句中出現了between、<、>、in等查詢。這種范圍掃描索引掃描比全表掃描要好
。因為他只需要開始于索引的某一點,而結束于另一點。不用掃描全部索引。index :full index scan ,index與all的區別為index類型只遍歷索引樹。這通常比all快,因為索引文件
比數據文件小。(也就是說雖然all和index都是讀取權標,但index是從索引中讀取的,all是從硬盤中讀取的)all:full table scan,將遍歷權標以找到匹配的行。
表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好。
key_len顯示的值為索引字段的最大可能長度,并非實際使用長度。即key_len是根據表定義計算而得,
不是通過表內檢索出的。(例如使用到的條件索引字段長度相加,a,b都建立索引。
where a=1 and b=2 長度為a.length +b。length)
額外擴展,包含不適合在其他列中顯示,但十分重要的額外信息。- using filesort:說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。mysql中無法利用索引完成的排序操作稱為“文件排序” (oder by 排序使用了非索引字段;)如果出現需要優化;- using temporary:使用了臨時表保存中間結果。mysql在對查詢結果排序時使用臨時表。常見于排序order by 和分組查詢group by。如果出現需要優化;(group by 一定盡量要和索引的順序一致,要么會特別容易產生文件類排序。)- using index :表示響應的select操作中使用了覆蓋索引。避免訪問了表的數據行。效率不錯;如果同時出現using where表明索引被用來執行索引鍵值的查找;如果沒有同時出現using where表明索引用來讀取數據而非執行查找動作。- using where :表明使用了where過濾- using join buffer :使用了連接緩存;- impossible where where:子句的值總是false,不能用來獲取任何元組;- select table optimized away:在沒有group by子句的情況下,基于索引優化min/max操作或者對于myisam存儲索引優化count(*)操作,不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化。- distinct:優化distinct操作,在找到第一匹配的元組后即停止找到同樣動作的;