索引的型別和常見的索引
索引的型別(索引有很多種型別,在mysql中,並沒有統一的索引標準,不同的儲存引擎的索引的工作方式並不一樣,也不是所有的儲存引擎都支援所有型別的索引)
1、B-Tree索引 大多數MySQL引擎都支援這種索引,對索引列是順序組織儲存的,很適合查詢範圍資料。如:像找出所有以I到K開頭的名字“這樣的查詢效率會非常高。適用於全鍵值,鍵值範圍或鍵字首(最左字首的查詢)查詢。
2、雜湊索引 雜湊索引只包含雜湊值和行指標,而不儲存欄位值。
無法用於排序,不是按照索引值順序儲存的
不支援部分索引列匹配查詢(雜湊索引是使用索引列的全部內容來計算雜湊值得)
只支援等值比較查詢,包括=、IN()、<=>
不支援任何範圍查詢
3、空間資料索引(R-Tree)
MyISAM索引支援空間索引。 無須字首查詢,會從所有維度索引資料
4、全文索引
5、其他索引類別
(第三方的儲存引擎來儲存索引,如:TokuDB 分形樹索引)
常見的索引有:
1. 普通索引(無限制)
2.唯一索引
主鍵就是唯一索引,但是唯一索引不一定是主鍵,唯一索引可以為空,但是空值只能有一個,主鍵不能為空。
普通唯一索引:單個欄位上建立唯一索引,需要此欄位所在的列上不能有重複的值,屬於二級索引。
複合唯一索引:多個欄位上聯合建立唯一索引,屬於二級索引。(參考了:https://www.jianshu.com/p/e1dce41a6b2b
3.單列索引
4.多列索引(字首)
5.覆蓋索引 : 一個索引包含(或者說覆蓋)所有需要查詢的欄位的值
6.聚族索引
InnoDB 主鍵使用的是聚簇索引,MyISAM 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。
聚族索引不是一種單獨的索引型別,而是一種資料儲存方式。InnoDB的聚族索引在同一結構中儲存了B-Tree索引和資料行。資料行存放在索引的葉子頁中,術語"聚族"表示資料行和相鄰的鍵值緊湊地儲存在一起。儲存引擎負責實現索引(不是所有的儲存引擎都支援聚族索引)。
InnoDB將通過主鍵聚集資料,如果沒有定義主鍵,InnoDB會選擇一個唯一的非空索引代替。如果沒有這樣的索引,InnoDB會隱式定義一個主鍵來作為聚族索引。
優點:1、資料訪問更快,聚族索引將索引和資料儲存在同一個B-Tree中,因此比在非聚族索引中獲取資料更快。
2、使用覆蓋索引掃描的查詢可以直接使用頁節點的主鍵值。
缺點: 1.插入速度嚴重依賴於插入順序。按照主鍵的順序插入是載入資料到InnoDB表中速度最快的方式。但如果不是按主鍵插入,最好使用optimize table命令重新組織表
2.更新聚族索引列的代價很高。因為會強制InnoDB將每個被更新的行移動到新的位置。
3..基於聚族索引的表在插入新行,或者主鍵被更新導致需要移動行的時候,可能面臨“”頁分頁“的問題。
當行的主鍵值要求必須將這一行插入到某個已滿的頁中時,儲存引擎會將改頁分頁成兩個頁來容納該行,這就是一次頁分頁操作,會導致表佔用更多的磁碟空間。聚族索引可能導致全表掃描變慢,尤其是行比較稀疏或者是頁分裂儲存不連續的時候。
二級索引葉子節點儲存的不是指向行的物理位置的指標,而是行的主鍵值。
7.全文索引
InnoDB 主鍵使用的是聚簇索引,MyISAM 不管是主鍵索引,還是二級索引使用的都是非聚簇索引。