id 查詢順序 表讀取順序
相同,順序;不同,從大到小
select_type 查詢類型 數據讀取操作的操作類型
- simple 簡單查詢,不包含子查詢或者union
- primary 查詢中如果包含任何子查詢,則最外層查詢被標記
- subquery select或where列表中包含了子查詢
- derived from列表中的子查詢,遞歸執行這些查詢,結果放在臨時表中
- union 如果第二個select出現在union之後,則被標記;若union包含在from子句的子查詢中,外層select將被標記爲derived
- union result 從union表獲取結果的select,兩表union結果的合併
table 查詢表名稱
type 訪問類型
最好到最差(一般到range 或者ref):
system>const>eq_ref>ref>range>index>all
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all
- system,表只有一行記錄
- const,通過索引一次就能找到,用於比較primary key或者unique索引,對應字段放在where列表中,該查詢轉換爲一個常量
- eq_ref,唯一性索引掃描,每個索引鍵對應表中一條記錄
- ref,非唯一性索引掃描,返回匹配某個單獨之的所有行
- range,只檢索給定範圍的行,使用一個使用來選擇行;key列會顯示使用了哪個索引,一般爲where中出現between、<、>、in等的查詢;不用掃描全部索引
- index, 全索引掃描,例如:查詢全部的主鍵列的值
possible_keys 可能用到的索引
查詢涉及到的字段存在的索引
key 實際用到的索引
- null 未使用到索引
- 查詢中若使用到了覆蓋索引,則該索引只出現在key列中
key_len 索引長度
- 索引中使用字節數,字段最大可能長度,並非實際長度,根據表定義計算,非表中檢索
- 不損失精度的情況下越短越好
ref 顯示索引的哪一列被使用了
- 可能的話是一個常量
- 庫.表.列
rows 每張表有多少行被優化器查詢
- 根據表的統計信息和需要選用情況,大致估算出找到所需記錄需要讀取的行數
extra
- Using filesort:無法利用索引完成排序操作稱作"文件排序";使用外部使用對數據進行排序,而不是按照表內索引順序進行數據讀取。
- Using temporary:使用臨時表保存中間結果,常見order by 和group by。
- Using index:使用了覆蓋索引,避免訪問表的數據行;
同時出現 using where:表明索引被用來執行索引鍵值得查找
沒有出現using where:表明索引被用來讀取數據而非查找 - Using where:使用了where過濾
- Using join buffer:調整join buffer大小
- impossible where:where條件一直爲false(a=‘a’ and a=‘b’)
- select tables potimized away:在沒有group by 子句的情況下,基於索引優化MIN/MAX操作
- distinct:優化distinct操作,在找到第一匹配的元組後即停止查找相同值的動作