索引數據結構:
目前大部分數據庫系統及文件系統都采用B Tree或者B+Tree作為索引結構
B樹:每個節點存儲m/2到M個關鍵字,非葉子節點儲存指向關鍵字范圍的子節點的指針或者某節點詳細數據;所有關鍵字在整棵樹中出現,且只出現一次,非葉子節點可以命中。
B+樹:在B+樹的基礎上,為葉子節點增加鏈表指針,所有關鍵字都在葉子節點中出現,非葉子節點作為葉子節點的索引;B+樹總是到葉子節點才能命中。
B*樹:在B+樹的基礎上,為非葉子節點也增加鏈表指針,將節點的最低利用率從1/2提高到2/3
MySql(默認使用InnoDB引擎),將記錄按照頁的方式進行管理,每頁大小默認為16k(這個值可以修改),Linux默認頁大小為4k
3階的B+樹,包含2層索引,每個索引節點4bytes,最后一層要存數據,假設數據大小也是4bytes,最后一層一個葉子節點是4+4 = 8
(4*1024/4) * (4*1024/4) * (4*1024/8) = 500 000 000 約為5億個key/value數據
為什么使用 B tree或者B+Tree
紅黑樹也可用來實現索引,但是文件系統及數據庫系統普遍采用B Tree或者B+ Tree,為什么?
一般來說,索引本身也很大,不可能全存內存,往往以索引文件的行駛存在磁盤
1.單節點能儲存更多數據,使得磁盤IO次數更少
2.葉子節點形成有序鏈表,便於執行范圍操作
3.聚集索引中,葉子節點的data直接包含數據;非聚集索引中,葉子節點儲存數據地址的指針
索引分類:
1.普通索引index:加速查找
2.唯一索引:
主鍵索引:primary key : 加速查找 + 約束 (不為空且唯一)
唯一索引:unique:加速查找 + 約束(唯一)
3.聯合索引:
聯合主鍵索引:primary key(id,name)
聯合唯一索引:unique(id,name)
聯合普通索引:index(id,name)
聚簇索引和非聚簇索引:
聚簇索引和非聚簇索引使用的都是B+樹結構
1.非聚簇索引
非聚簇索引的葉子節點為索引節點,但是有一個指針指向數據節點
MyISAM是非聚簇索引
2.聚簇索引
聚簇索引的葉子節點就是數據節點
關於聚簇索引,InnoDB會按照如下規則進行處理;
1.如果一個主鍵被定義了,那么這個主鍵就是作為聚簇索引
2.如果沒有主鍵被定義,那么該表的第一個唯一非空索引會被作為聚簇索引
3.如果沒有主鍵也誒有合適的唯一索引,那么InnoDB內部會生成一個隱藏的主鍵作為聚簇索引,這個隱藏的主鍵是一個6個字節的列,該列的值會隨着數據的插入而自增。
InnoDB的普通索引,唯一索引,聯合索引都是輔助索引,采用非聚簇索引,采用非聚簇索引結構。InnoDB的所有輔助索引都引用主鍵作為data域。
聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索索引獲取主鍵,然后用主鍵到主索引中檢索獲得記錄,這個過程叫做
回表