mysql explain信息解釋

id 查詢順序 表讀取順序

相同,順序;不同,從大到小

select_type 查詢類型 數據讀取操作的操作類型

  1. simple 簡單查詢,不包含子查詢或者union
  2. primary 查詢中如果包含任何子查詢,則最外層查詢被標記
  3. subquery select或where列表中包含了子查詢
  4. derived from列表中的子查詢,遞歸執行這些查詢,結果放在臨時表中
  5. union 如果第二個select出現在union之後,則被標記;若union包含在from子句的子查詢中,外層select將被標記爲derived
  6. 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 
  1. system,表只有一行記錄
  2. const,通過索引一次就能找到,用於比較primary key或者unique索引,對應字段放在where列表中,該查詢轉換爲一個常量
  3. eq_ref,唯一性索引掃描,每個索引鍵對應表中一條記錄
  4. ref,非唯一性索引掃描,返回匹配某個單獨之的所有行
  5. range,只檢索給定範圍的行,使用一個使用來選擇行;key列會顯示使用了哪個索引,一般爲where中出現between、<、>、in等的查詢;不用掃描全部索引
  6. index, 全索引掃描,例如:查詢全部的主鍵列的值

possible_keys 可能用到的索引

查詢涉及到的字段存在的索引

key 實際用到的索引

  1. null 未使用到索引
  2. 查詢中若使用到了覆蓋索引,則該索引只出現在key列中

key_len 索引長度

  1. 索引中使用字節數,字段最大可能長度,並非實際長度,根據表定義計算,非表中檢索
  2. 不損失精度的情況下越短越好

ref 顯示索引的哪一列被使用了

  1. 可能的話是一個常量
  2. 庫.表.列

rows 每張表有多少行被優化器查詢

  1. 根據表的統計信息和需要選用情況,大致估算出找到所需記錄需要讀取的行數

extra

  1. Using filesort:無法利用索引完成排序操作稱作"文件排序";使用外部使用對數據進行排序,而不是按照表內索引順序進行數據讀取。
  2. Using temporary:使用臨時表保存中間結果,常見order by 和group by。
  3. Using index:使用了覆蓋索引,避免訪問表的數據行;
    同時出現 using where:表明索引被用來執行索引鍵值得查找
    沒有出現using where:表明索引被用來讀取數據而非查找
  4. Using where:使用了where過濾
  5. Using join buffer:調整join buffer大小
  6. impossible where:where條件一直爲false(a=‘a’ and a=‘b’)
  7. select tables potimized away:在沒有group by 子句的情況下,基於索引優化MIN/MAX操作
  8. distinct:優化distinct操作,在找到第一匹配的元組後即停止查找相同值的動作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章