MYSQL索引

索引簡介

    索引是存儲引擎用於加快查詢的一種數據結構,一種優良的索引策略能夠對查詢性能有效的優化。索引有以下三個優點:

  1. 索引減少了需要掃描的數據量
  2. 索引可以幫助服務器避免排序和臨時表
  3. 索引可以將隨機IO變成順序IO

    但是,索引並不是越多越好,過多的索引易導致磁盤使用率上升,給系統帶來負擔。總體來說,一般只有索引幫助存儲引擎快速查找到記錄帶來的好處大於其帶來的開銷時候,索引纔是有效的。一般用於中到大型表的多值屬性;當表太小,直接全表掃描最有效;當表太大,索引的代價會隨之增加,這時用分區技術會更好。

索引類型

    索引的類型,一般分成三類:B+樹索引,哈希索引,全文索引。

哈希索引

    哈希索引是基於哈希表而實現的,只有精確匹配索引的所有列的查詢纔能有效,範圍查找是不能使用哈希索引的。查找時間複雜度爲O(1),速度很快。對於InnoDB存儲引擎而言,其擁有一種自適應哈希索引(InnoDB會根據表的使用情況自動的爲表生成哈希索引,用戶無法控制),衝突機制採用鏈表法,哈希函數採用除法散列的方式。

    B+樹索引可以利用前綴索引,哈希索引不行。

全文索引

    全文索引是一種特殊的索引類型,用於查找文本中的關鍵詞,而不是比較索引中的值,所以匹配方式與其他的索引完全不一樣,有點類似於搜索引擎中的查找。

B+樹索引

    B+樹索引是大多是存儲引擎中使用的。分爲聚集索引和輔助索引(二級索引)。聚集索引指的是B+樹中的葉子節點,不單單包含索引的鍵值,還包含了實際的數據行(但是非葉子節點只存儲索引鍵值),“聚集”的意思就是數據行和索引鍵值存儲在一起。輔助索引中葉子節點保存了索引鍵值和數據行主鍵值(注意不是數據行的指針,所以輔助索引需要兩次索引查找)

    因爲實際數據只能按照一顆B+樹進行排序,所以每張表中只能有一個聚集索引。InnoDB默認爲通過主鍵進行聚集數據,如果沒有定義主鍵,InnoDB會選擇一個非空索引替代(MyISAM不支持聚集索引,無論是主鍵還是二級索引都是非聚集索引)

    聚集索引的優點:

  1. 可以把相關數據保存在一起,減少磁盤IO。
  2. 數據訪問更加快,因爲數據和索引保存在一起,非聚集索引需要兩次索引查找,聚集索引只需要一次
  3. 使用覆蓋索引掃描的查詢可以直接使用葉節點中的主鍵值

    聚集索引缺點:

  1. 插入、更新聚集索引的代價很高
  2. 在插入或者主鍵被更新的時候會產生“頁分類”問題,頁分類會導致表佔用很多磁盤空間,可以採取一些策略進行優化。
  3. 聚集索引會導致全表掃描變慢

     聯合索引指的是對錶中的多列進行索引。如下圖所示,對錶中的列a和列b建立聯合索引,可以用於select * from t where a=x and b=x; 也可以用於列a單獨索引,select * from t where a=x;但是不能用於列b單獨索引,因爲其不是有序的。因此使用聯合索引的時候主要要把選擇性最高的列放在索引的最前面。

    覆蓋索引,即一個索引包含所需要查詢的字段的值。通常而言,在輔助索引中,可以直接查詢到記錄,而不需要查詢聚集索引中的記錄,就是覆蓋索引

MYSQL索引基本操作

索引創建

ALTER TABLE 表名 ADD 索引類型 [索引名] (字段名)

    索引類型可以爲:index(普通索引),unique(唯一索引),primary key(主鍵索引),fulltext index(全文索引)。同時也可以用create index在創建表的時候創建索引

CREATE INDEX 索引名 ON 表名(列名)

查看錶中的索引

show index from 表名;

刪除索引

drop index 索引名 on 表名 ;

alter table 表名 drop index 索引名 ;

 

參考 《高性能MYSQL》

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