為什么數據庫用b+樹不用b樹和紅黑樹


前幾天面試被問到了,沒答好,記錄一下:

首先說紅黑樹為什么不行:

1.紅黑樹必須存在內存里的,數據庫表太大了,存不進去。

2.即使你找到了把紅黑樹存進硬盤的方法,紅黑樹查找一個節點最多要查logN層,每一層都是一個內存頁(雖然你只是想找一個節點,但硬盤必須一次讀一個頁。。),那么一共logN次IO,傷不起阿!

 

所以我們必須考慮減少樹的層數來減少IO次數從而加快查詢、修改數據庫效率,b和b+樹都符合這樣的性質,它們每個節點的孩子都很多(幾十~幾千),所以整個樹的高度可以壓的很低。

比如100000000數據,每個節點有1000個孩子,那么log 1000(100000000)<3,3層就足夠存了!

 

先講下b樹和b+樹的區別:

b樹的所有節點都是數據節點,但b+樹只有葉子節點是數據節點,非葉子(內部)節點只起導向作用,不存儲實際數據。

b+樹的所有數據節點都在最下層(葉子節點層),相鄰節點有鏈表相連。

注意磁盤讀數據讀一個字節和讀10個字節和讀一頁時間相差不大的(因為磁盤查找時間大多數都花在尋道上,旋轉基本不費時)

再說b樹為什么不如b+樹:

1.b樹的內部節點都是存儲實際數據的,比如一個節點是一個頁4096字節,其中每條數據128字節,那么一個節點只能存32個數據項,那么對應的孩子節點數最多為33個,這顯然不夠用。而b+樹內部節點只作為導向作用,只存一個整數就可以,4096/4=1024個數據項。這樣b+樹的每個節點的孩子數更多,整個樹的高度就更低,大大增加查詢效率。

2.b+樹的葉子節點有鏈表相連,適合范圍查詢,因為相鄰頁直接讀取就好了。但b樹做不到這一點。

就簡單說這些。


免責聲明!

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



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