mysql索引 select_type和extra

一、索引使用場景 哪些情況需要創建索引

1、主鍵自動建立唯一索引 2

、頻繁作爲查詢條件的字段應該創建索引 where

3、多表關聯查詢中,關聯字段應該創建索引 on 兩邊都要創建索引

4、查詢中排序的字段,應該創建索引 B + tree 有順序

5、覆蓋索引 好處是? 不需要回表 組合索引

6、統計或者分組字段,應該創建索引

哪些情況不需要創建索引

1、表記錄太少 索引是要有存儲的開銷

2、頻繁更新 索引要維護

3、查詢字段使用頻率不高

參數說明

expain出來的信息有10列,分別是

id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

select_type(重要)

查詢類型,主要用於區別普通查詢、聯合查詢(union、union all)、子查詢等複雜查詢。 type(重要)

依次從好到差

system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range, index_merge,index,ALL

最少要索引使用到range級別。

system  表中只有一行數據或者是空表。

const 使用唯一索引或者主鍵,返回記錄一定是1行記錄的等值where條件時,通常type是const。其他數據庫

也叫做唯一索引掃描

eq_ref  關鍵字:連接字段主鍵或者唯一性索引。

此類型通常出現在多表的 join 查詢, 表示對於前表的每一個結果, 都只能匹配到後表的一行結果. 並且查 詢的比較操作通常是 '=', 查詢效率較高.

ref 針對非唯一性索引,使用等值(=)查詢非主鍵。或者是使用了最左前綴規則索引的查詢。

fulltext  全文索引檢索,要注意,全文索引的優先級很高,若全文索引和普通索引同時存在時,mysql不管代 價,優先選擇使用全文索引

ref_or_null 與ref方法類似,只是增加了null值的比較。實際用的不多。

unique_subquery 用於where中的in形式子查詢,子查詢返回不重複值唯一值

index_subquery 用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值,可以使用索引將子查詢 去重。

range 索引範圍掃描,常見於使用>,<,is null,between ,in ,like等運算符的查詢中。

index_merge 表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and ,or的條件使用了不同的索引,官方 排序這個在ref_or_null之後,但是實際上由於要讀取數個索引,性能可能大部分時間都不如range

index 索引全表掃描,把索引從頭到尾掃一遍,常見於使用索引列就可以處理不需要讀取數據文件的查詢、可 以使用索引排序或者分組的查詢。

all 這個就是全表掃描數據文件,然後再在server層進行過濾返回符合要求的記錄。

extra

這個列包含不適合在其他列中顯示單十分重要的額外的信息,這個列可以顯示的信息非常多,有幾十

種,常用的有

no tables used 

不帶from字句的查詢或者From dual查詢
使用not in()形式子查詢或not exists運算符的連接查詢,這種叫做反連接 即,一般連接查詢是先查詢內表,再查詢外表,反連接就是先查詢外表,再查詢內表。

using filesort 

  • 排序時無法使用到索引時,就會出現這個。常見於order by和group by語句中
  • 說明MySQL會使用一個外部的索引排序,而不是按照索引順序進行讀取。
  • MySQL中無法利用索引完成的排序操作稱爲“文件排序”

using index

查詢時不需要回表查詢,直接通過索引就可以獲取查詢的數據。

  • 表示相應的SELECT查詢中使用到了覆蓋索引(Covering Index),避免訪問表的數據行,效率不 錯! 
  • 如果同時出現Using Where ,說明索引被用來執行查找索引鍵值
  • 如果沒有同時出現Using Where ,表明索引用來讀取數據而非執行查找動作。

using temporary

  • 表示使用了臨時表存儲中間結果。
  • MySQL在對查詢結果order by和group by時使用臨時表
  • 臨時表可以是內存臨時表和磁盤臨時表,執行計劃中看不出來,需要查看status變量, used_tmp_table,used_tmp_disk_table才能看出來。
  • distinct  在select部分使用了distinct關鍵字 (索引字段) ,使用distinct儘可能減小結果集。

using where

  表示存儲引擎返回的記錄並不是所有的都滿足查詢條件,需要在server層進行過濾。

using index condition

  查詢條件中分爲限制條件和檢查條件,5.6之前,存儲引擎只能根據限制條件掃描數據並返回,然 後server層根據檢查條件進行過濾再返回真正符合查詢的數據。5.6.x之後支持ICP特性,可以把檢 查條件也下推到存儲引擎層,不符合檢查條件和限制條件的數據,直接不讀取,這樣就大大減少了 存儲引擎掃描的記錄數量。extra列顯示using index condition

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章