前幾天面試被問到了,沒答好,記錄一下:
首先說紅黑樹為什么不行:
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樹做不到這一點。
就簡單說這些。