從一道索引數據結構面試題看B樹、B+樹


題目1: Mysql數據庫用過吧?l里面的索引是基於什么數據結構。

答:主要是基於Hash表和B+樹

題目2: 很好請你說一下B+樹的實現細節是什么樣的?B-樹和B+樹有什么區別?聯合索引在B+樹中如何存儲?

答: 首先,數據庫使用樹型結構來增加查詢效率,並保持有序。那么,為什么不使用二叉樹來實現數據結構呢,二叉樹算法時間復雜度是lg(N),查詢速度和比較次數都是較小的。

實際上,查詢索引操作最耗資源的不在內存中,而是磁盤IO。索引是存在磁盤上的,當數據量比較大的時候,索引的大小可能達到幾個G。那么,我們利用索引進行查詢的時候,不可能把索引直接加載到內存中,只能一次讀取一個磁盤頁,一個磁盤頁對應着一個節點,一次讀取操作時一個磁盤io。

在二叉樹查詢時,最壞的情況下查找的次數是樹的高度,即io次數為樹的高度。B-樹就是比二叉樹“矮胖”的樹。

二叉樹的特征如下:

1. 根節點至少有兩個子女

2. 每個中間節點包含k-1個元素和k個孩子,其中 m/2 <= k <= m

3. 每個葉子節點包含k-1個元素,其中 m/2 <= k <= m

4. 所有葉子節點位於同一層

5. 節點中的元素從小到大排列,正好是孩子節點的值域。(就是孩子節點的元素都比父節點中元素的最小值大,比父節點元素的最大值小)

B-樹查詢的次數並不比二叉樹的次數小,但是相比起磁盤io速度,內存中比較的耗時就不足為提了。所以只要樹的高度足夠低,io次數少,就可以提升查找性能。而每個節點中有多個元素,都只在內存中操作。

而B+樹是基於B-樹的,增加了如下規則:

1. 有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。

2. 所有的葉子結點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。

3. 所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

所以,B+樹對比B-樹有如下好處:

io次數少:b+樹中間節點只存索引,不存在實際的數據,所以可以存儲更多的數據。索引樹更加的矮胖,io次數更少。
性能穩定:b+樹數據只存在於葉子節點,查詢性能穩定
范圍查詢簡單:b+樹不需要中序遍歷,遍歷鏈表即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM