MySQL_基礎結構_B(B-)/B+ 樹

 

參考文章:

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樹(又叫平衡多路查找樹) 注意B- 樹就是B樹,- 只是一個符號。中間的短線是英文連接符,只是翻譯的時候將短線翻譯成了減號。
B / B- 樹 全稱Balance-tree(平衡多路查找樹)平衡的意思是左邊和右邊分佈均勻。多路的意思是相對於二叉樹而言的,二叉樹就是二路查找樹,查找時只有兩條路,而B-tree有多條路,即父節點有多個子節點。

 

B / B- 樹用途

使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。這個數據結構一般用於數據庫的索引,綜合效率較高。

 

B / B- 樹的定義

(1)樹中每個結點至多有m 棵子樹(注:m指的是樹的階);

(2)若根結點不是葉子結點,則至少有兩棵子樹(注:根節點至少有兩個兒子);

(3)除根結點之外的所有非葉子結點至少有p個子節點(\left \lceil m/2 \right \rceil\leqslant p\leqslant m, \left \lceil m/2 \right \rceil爲向上取整。);

(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)

      爲關鍵碼的個數\left \lceil m/2 \right \rceil-1\leqslant n\leqslant m-1)。

(5)所有的葉子結點都出現在同一層次上,即所有葉節點具有相同的深度,等於樹高度。並且不帶信息(可以看作是外部結點或查找失敗的結點,實際上這些結點不存在,指向這些結點的指針爲空)。 

 

 

B+ 樹

如上圖所示 爲一顆 B樹,B 樹 爲 B / B -  樹 的一種變體

 

 

B + 樹定義

 

B + 樹的定義 與 B / B - 樹相同,除了以下幾點 :

  (1)  非葉子結點的子樹指針與關鍵字個數相同 。

  (2)  非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間)。

  (3)  爲所有葉子結點增加一個鏈指針  

  (4)  所有關鍵字都在葉子結點出現 。

 

B + 樹特性

 

1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;

 2.不可能在非葉子結點命中;

 3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;

       

B + 樹用途

  1.更適合文件索引系統;

   2.MySQL INNODB 引擎的索引

 

B / B-  樹 與 B + 樹的區別 


B+Tree相對於B-Tree有幾點不同:

1. 非葉子節點只存儲鍵值信息。

2. 所有葉子節點之間都有一個鏈指針。

3. 數據記錄都存放在葉子節點中。

4.B樹的節點中沒有重複元素,B+樹有。