1、定義
索引是一種數據結果,幫助提高獲取數據的速度
為了提高查找速度,有很多查詢優化算法。但是每種查找算法都只能應用於特定數據結構之上。
索引就是數據庫創建的滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據
2、索引數據結構
目前大部分數據庫系統及文件系統都采用B Tree或其變種B+Tree作為索引結構
相關概念介紹
- B-樹(B樹):多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字范圍的子結點;所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
- B+樹:在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中;
- B*樹:在B+樹基礎上,為非葉子結點也增加鏈表指針,將結點的最低利用率從1/2提高到2/3;
3、為什么使用B Tree(B+Tree)
紅黑樹也可用來實現索引,但是文件系統及數據庫系統普遍采用B/+Tree,為什么?
一般來說,索引本身也很大,不可能全存內存,往往以索引文件的形式存在磁盤
(1)單節點能存儲更多數據,使得磁盤IO次數更少。
(2)葉子節點形成有序鏈表,便於執行范圍操作。
(3)聚集索引中,葉子節點的data直接包含數據;非聚集索引中,葉子節點存儲數據地址的指針。
4、索引分類
1.普通索引index :加速查找
2.唯一索引
主鍵索引:primary key :加速查找+約束(不為空且唯一)
唯一索引:unique:加速查找+約束(唯一)
3.聯合索引
-primary key(id,name):聯合主鍵索引
-unique(id,name):聯合唯一索引
-index(id,name):聯合普通索引
5、聚集索引和非聚集索引
聚集索引和非聚集索引使用的都是B+樹結構。
1、非聚集索引
非聚集索引的葉子節點為索引節點,但是有一個指針指向數據節點。
MyISAM是非聚集索引。
2、聚集索引
聚集索引葉子節點就是數據節點。
關於聚集索引,innodb會按照如下規則進行處理:
1,如果一個主鍵被定義了,那么這個主鍵就是作為聚集索引
2,如果沒有主鍵被定義,那么該表的第一個唯一非空索引被作為聚集索引
3,如果沒有主鍵也沒有合適的唯一索引,那么innodb內部會生成一個隱藏的主鍵作為聚集索引,這個隱藏的主鍵是一個6個字節的列,改列的值會隨着數據的插入自增。
innodb的普通索引,唯一索引,聯合索引都是輔助索引,采用非聚集索引結構。InnoDB的所有輔助索引都引用主鍵作為data域。
聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。