參考文章:
1.B+樹總結
https://www.jianshu.com/p/71700a464e97
2.B-Tree Hash b+Tree三種索引特點對比
https://blog.csdn.net/weixin_42540340/article/details/88835023
3.MySQL索引的原理,B+樹、聚集索引和二級索引的結構分析
http://www.javashuo.com/article/p-bmewpzsg-ew.html
4.MySQL數據庫中索引的數據結構是什麼?(B樹和B+樹的區別)
https://www.cnblogs.com/linliquan/p/11364428.html
5.B樹, B-樹,B+樹,和B*樹的區別
https://www.cnblogs.com/itxiaok/p/9459716.html
MySQL 的 Innodb 使用了 B+ 索引,說起 B+ 索引,那我們必須聊聊 B(B-) / B+ 數據結構,本篇對相關的數據結構 做一個大致的介紹。
對於一棵m階B-tree,每個結點至多可以擁有m個子結點。
即遍觀整棵樹,子節點最多的個數是m,那麼這棵樹就是m階樹。
B樹(又叫平衡多路查找樹) 注意B- 樹就是B樹,- 只是一個符號。中間的短線是英文連接符,只是翻譯的時候將短線翻譯成了減號。
B / B- 樹 全稱Balance-tree(平衡多路查找樹),平衡的意思是左邊和右邊分佈均勻。多路的意思是相對於二叉樹而言的,二叉樹就是二路查找樹,查找時只有兩條路,而B-tree有多條路,即父節點有多個子節點。
使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。這個數據結構一般用於數據庫的索引,綜合效率較高。
(1)樹中每個結點至多有m 棵子樹(注:m指的是樹的階);
(2)若根結點不是葉子結點,則至少有兩棵子樹(注:根節點至少有兩個兒子);
(3)除根結點之外的所有非葉子結點至少有p個子節點(, 爲向上取整。);
(4)所有的非葉子結點中包含以下數據:(n,A0,K1,A1,K2,…,Kn,An)
其中:
Ki(i=1,2,…,n)爲關鍵碼,且Ki<Ki+1(注:ki是真實數據,存放在線性表當中,且從左至右升序排列)
Ai 爲指向兒子的指針(i=0,1,…,n),且指針Ai-1 所指子樹中所有結點的關鍵碼均小於Ki (i=1,2,…,n),An 所指子樹中所有結點的 關鍵碼均大於Kn。(注:每個ki數據兩旁各安放了一個指針,即Ai-1和Ai,左邊的子樹數據統統小於ki,右邊子樹的數據統 統大於ki)(注:總體來看指針數量比數據數量多1)
n 爲關鍵碼的個數()。
(5)所有的葉子結點都出現在同一層次上,即所有葉節點具有相同的深度,等於樹高度。並且不帶信息(可以看作是外部結點或查找失敗的結點,實際上這些結點不存在,指向這些結點的指針爲空)。
如上圖所示 爲一顆 B樹,B 樹 爲 B / B - 樹 的一種變體
B + 樹的定義 與 B / B - 樹相同,除了以下幾點 :
(1) 非葉子結點的子樹指針與關鍵字個數相同 。
(2) 非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間)。
(3) 爲所有葉子結點增加一個鏈指針
(4) 所有關鍵字都在葉子結點出現 。
1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;
2.不可能在非葉子結點命中;
3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;
1.更適合文件索引系統;
2.MySQL INNODB 引擎的索引
B+Tree相對於B-Tree有幾點不同:
1. 非葉子節點只存儲鍵值信息。
2. 所有葉子節點之間都有一個鏈指針。
3. 數據記錄都存放在葉子節點中。
4.B樹的節點中沒有重複元素,B+樹有。