MySQL學習筆記九:索引
一、索引分類
1.1、索引的分類有以下幾種:
1)單值索引:即一個索引只包含單個列,一個表可以有多個單列索引。
2)唯一索引:索引列的值必須唯一,但允許有空值。
3)複合索引:一個索引包含多個列,如INDEX MultiIdx(id,name,age)
4)全文索引:只有在MyISAM引擎上才能使用,只能在CHAR、VARCHAR、TEXT型別欄位上使用全文索引。
5)空間索引:空間索引是對空間資料型別的欄位建立的索引。
二、索引操作
2.1、建立索引
語法:CREATE INDEX 索引名稱 ON table (column[,column]...);
CREATE INDEX ID_INDEX ONemp (ID); CREATE INDEX NAME_INDEX ON emp (NAME);
2.2、刪除索引
語法:DROP INDEX 索引名稱 ON 表名;
DROP INDEX NAME_INDEX ON emp;
2.3、檢視索引
語法:SHOW INDEX FROM 表名;
SHOW INDEX FROM emp;
2.4、自動建立索引
1)在表上定義了主鍵時,會自動建立一個對應的唯一索引。
2)在表上定義了一個外來鍵時,會自動建立一個普通索引。
三、EXPLAIN
3.1、關於EXPLAIN
作用:用來檢視索引是否正在被使用,並且輸出其使用的索引的資訊。
3.2、EXPLAIN使用示例
3.3、EXPLAIN輸出資訊
id:select查詢的序列號,包含一組數字,表示查詢中執行select子句或操作表的順序。
select_type:所使用的SELECT查詢型別。
table:顯示這一行的資料是關於哪張表的。
type:type顯示的是訪問型別,是較為重要的一個指標,結果值從最好到最差依次是:system>const>eq_ref>ref<range>index>all(倒序)一般來說,保證查詢至少達到range級別,最好能達到ref。
key:實際使用的索引,若為null,則沒有使用到索引。(兩種可能,①沒建立索引。②建立索引,但索引失效)。查詢中若使用了覆蓋索引,則該索引僅出現在key列表中。
possible_keys:顯示可能應用在這張表中的索引,一個或多個。查詢涉及到的欄位上若存在索引,則該索引將被列出,但不一定被查詢實際使用。
key_len:表示索引中使用的位元組數,可通過該列計算查詢中使用的索引的長度。在不損失精確型的情況下,長度越短越好,key_len顯示的值為索引欄位的最大可能長度,並非實際使用長度,即key_len是根據定義計算而得,不是通過表內檢索出的。
ref:顯示索引的哪一列被使用了,如果可能的話,是一個常數,哪些列或者常量被用於查詢索引列上的值。只有當type為ref的時候,ref這列才會有值。
rows:根據表統計資訊以及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數,所以越小越好。可以用來查詢sql的讀取行數。
extra:包含不適合在其它列中顯示但十分重要的額外資訊。
四、哪些情況適合/需要建立索引
4.1、以下情況適合/需要建立索引:
1)主鍵(自動建立唯一索引)
2)外來鍵
3)查詢中與其它表關聯的欄位
4)頻繁作為查詢條件的欄位
5)查詢中統計或者分組的欄位
6)查詢中排序的欄位
五、哪些情況不適合建立索引
5.1、以下情況不適合建立索引:
1)頻繁更新的欄位,因為每次更新不單單更新了記錄還會更新索引。
2)WHERE條件裡用不到的欄位
3)表記錄太少
4)經常增刪改的表
5)如果某個資料列包含太多重複的內容(如性別,為它建立索引就沒有太大的實際效果。)