一、索引使用場景 哪些情況需要創建索引
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