b樹b 樹b 樹 資料庫之B 樹

2021-10-13 18:46:24 字數 2498 閱讀 4332

資料庫索引就是使用b-樹和b+樹來實現的

為什麼要建立b+樹演算法?

給出兩個常用的sql語句:

根據某個值查詢資料:select * from user where id=1234;

根據區間值來查詢某些資料:select * from user where id>1234and id<2345

考慮到效能方面的需求,主要是執行效率和儲存空間

在執行效率方面,我們希望通過索引,查詢資料的效率盡可能的高,在儲存空間方面,我們希望索引不要消耗太多的記憶體空間.

平衡二叉查詢樹:雖然查詢效率很高,時間複雜度為o(nlogn).而且對樹進行中序遍歷,可以得到乙個從小到大進行排列的資料結構.但是並不支援按照區間快速查詢資料.

我們可以通過改造二叉查詢樹來解決這個問題:

樹中的節點並不儲存資料本身,而只儲存索引.除此之外,我們把每個葉子節點串在一條鍊錶上,鍊錶中的資料是從小到大有序排列的.下圖為經過改造後的二叉查詢樹:

改造之後,如果我們需要求某個區間的資料.我們只需要拿區間的起始值,在樹中進行查詢,當查詢到某個葉子節點後,我們再順著鍊錶往後遍歷,直到鍊錶中的節點資料值大於區間的終止值為止.所有遍歷到的資料,就是符合區間值的所有資料.

但是,我們需要考慮到,要為幾千萬甚至上億的資料構建索引,如果將索引儲存再記憶體中,儘管記憶體的速度非常快,查詢的效率非常高,但是,占用的記憶體會非常多.

我們可以借助以時間換空間的思路,把索引儲存在硬碟中,而非記憶體中.但是硬碟的讀取速度為毫秒級別,記憶體的訪問速度是納秒級別的,讀取同樣大小的資料,從磁碟中花費的時間是從記憶體中讀取所花費的時間的上萬倍,甚至幾十萬倍.嚴重影響到了查詢效率.

二叉查詢樹,經過改造以後,就支援區間查詢的功能了.不過為了節省記憶體,如果把樹儲存在硬碟中,那麼每個節點的讀取,都要經過一次磁碟操作.樹的高度就為每次查詢資料時,磁碟io操作的次數.

那麼乙個優化方法就是減少樹的高度,那麼如何減少樹的高度呢?答案是構建多叉樹.

對於相同個數的資料構建m叉樹索引,m叉樹中的m越大,那麼樹的高度就越小,那麼m叉樹的m是不是越大越好呢?

記憶體和磁碟中的資料都是按頁(一頁大小通常為4kb)來讀取的,一次會讀取一頁的資料,如果讀取的資料量超過一頁,就會觸發多次io操作.所以,在選擇m大小的時候,盡量讓每個節點的大小等於乙個頁的大小.這樣,讀取乙個節點,只需要一次磁碟io操作.

資料的寫入會涉及到索引的更新,會導致寫入變慢.對於乙個b+樹來說,m值是根據頁的大小事先計算好的,也就是說,每個節點最多只能有m個子節點.在往資料庫中寫入資料的時候,有可能使得索引中某些結點的子節點個數超過m.造成讀取乙個節點的資料要進行多次磁碟io操作.所以需要進行結點裂變.

同樣在刪除節點的時候,可能導致某些結點的個數過少,如果每個節點的個數都很少,會影響到索引的效率.於是設定了乙個閾值.如果某個節點的子節點個數小於m/2,就將其與兄弟結點合併.

b+樹的特點:

每個結點中子節點的個數不能超過m,也不能小於m/2.

根節點的子結點個數可以不超過m/2,這是乙個例外.

m叉樹只儲存索引,並不儲存資料.

通過鍊錶將葉子節點串聯到一起,方便區間查詢.

一般情況,根節點儲存在記憶體中,其他結點儲存在磁碟中.

與b樹區別:

b樹結點儲存資料

b樹葉子節點不需要鍊錶來串聯

b+樹中,將葉子節點串起來的鍊錶,是單向鍊錶還是雙向鍊錶?為什麼?

對於b+tree葉子節點,是用雙向鍊錶還是用單鏈表,得從具體的場景思考。我想,大部分同學在開發中遇到的資料庫查詢,都遇到過公升序或降序問題,即類似這樣的sql: select name,age, ... from where uid > startvalue and uid< endvalue order by uid asc(或者desc),此時,資料底層實現有兩種做法:    1)保證查出來的資料就是使用者想要的順序    2)不保證查出來的資料的有序性,查出來之後再排序    以上兩種方案,不加思考,肯定選第一種,因為第二種做法浪費了時間(如果選用記憶體排序,還是考慮資料的量級)。那如何能保證查詢出來的資料就是有序的呢?單鏈表肯定做不到,只能從頭往後遍歷,再想想,只能選擇雙向鍊錶了。此時,可能有的同學又問了:雙向鍊錶,多出來了一倍的指標,不是會多占用空間嘛?答案是肯定的。可是,我們再細想下,資料庫索引本身都已經在磁碟中了,對於磁碟來說,這點空間已經微不足道了,用這點空間換來時間肯定划算呀。順便提一下:在實際工程應用中,雙向鍊錶應用的場景非常廣泛,畢竟能大量減少鍊錶的遍歷時間

B樹,B 樹,B 樹,B 樹

小彰的部落格 b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點...

B樹 B 樹 B 樹 B 樹

b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就...

B樹 B 樹 B 樹 B 樹

b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...