B+樹
B+樹 是 B樹 的擴充套件,允許有效的插入,刪除和搜尋操作。
在 B樹 中,鍵和記錄(資料)都可以儲存在內部節點和葉子節點中。 然而,在 B+樹 中,記錄只能儲存在葉節點上,而內部節點只能儲存鍵值。
B+樹 的葉節點以單連結串列的形式連結在一起,解決區間查詢,以使搜尋查詢更加高效。
B+樹 用於無法儲存大量的資料在主儲存器中。 由於主儲存器的大小總是有限的,B+樹 的內部節點(訪問記錄的鍵)儲存在主儲存器(記憶體)中,而葉節點儲存在輔助儲存器(硬碟)中。由於記憶體的查詢速度遠大於硬碟,就可以把 鍵 放入記憶體,把 記錄 放入硬碟,以達到最優方案。
B+樹 的內部節點通常稱為索引節點。
在 B+樹 中的節點通常被表示為一組有序的元素和子指標。如果此 B+樹 的階數是m,則除了根之外的每個節點都包含最少 m/2 個元素最多 m 個元素,對於任意的結點有最多 m 個子指標。對於所有內部節點,子指標的數目總是與元素的數目相同。所有葉子都在相同的高度上,葉結點本身按關鍵字大小從小到大連結。
B+樹 的優點
可以在相同數量的磁碟訪問中獲取記錄。 樹的高度保持平衡,與 B樹 相比較少。 我們可以順序訪問儲存在 B+樹 中的資料,也可以直接訪問。 鍵用於索引。 更快的搜尋查詢,因為資料僅儲存在葉節點上。
B+樹 的實現
1.查詢 類似於 二叉查詢樹。起始於根節點,自頂向下遍歷樹,選擇其分離值在要查詢值的任意一邊的子指標。
2.插入 首先,查詢到要插入其中的節點的位置。接著把值插入這個節點中。
如果沒有節點違反 B+樹 的規則(不能大於 m-1 個元素)直接成功返回。
如果某個節點有過多元素,則把它分裂為兩個節點,每個都有最小數目的元素。在樹上遞迴向上繼續這個處理直到到達根節點,如果根節點被分裂,則建立一個新根節點。分裂的節點一般是這組元素的中位數。
3.刪除 首先,查詢到要刪除的值,從葉子節點中刪除鍵和資料。
如果沒有節點違反 B+樹 的規則(不能小於 m/2 個元素)直接成功返回。
如果葉節點包含少於最小數量的元素,則將節點與其兄弟節點合併,並刪除它們之間的鍵。
如果索引節點包含少於最小數量的元素,則將節點與兄弟節點合併,並在它們之間向下移動鍵。
B-樹 與 B+樹的區別
1.搜尋鍵無法重複儲存; 可以存在冗餘搜尋鍵。 2.資料可以儲存在葉節點以及內部節點中;資料只能儲存在葉節點上。 3.搜尋某些資料的過程較慢,因為可以在內部節點和葉節點上找到資料; 搜尋速度相對較快,因為只能在葉節點上找到資料。 4.刪除內部節點非常複雜且耗時;刪除永遠不會是一個複雜的過程,因為元素將始終從葉節點中刪除。 5.葉節點不能連結在一起;葉節點連結在一起以使搜尋操作更有效。
總結
B+樹 把內部節點當作鍵來儲存,儲存的元素比較少,可以放入記憶體中,提升查詢效率。葉子節點裡儲存裡鍵和資料,適合放入硬碟,只需要少量的讀取硬碟即可完成查詢。因為記憶體的讀取比硬碟塊很多,所以效率提升很多。
由於 B+樹 內部節點只有鍵,儲存內容較少,增刪查時間複雜度為 O(log n),葉子節點連結在一起,可以區間查詢等,所以非常適合做資料庫索引儲存結構。資料庫主鍵索引最好是自增的,以提升插入效率。
PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
公眾號:「清塵閒聊」。
歡迎一起談天說地,聊程式碼。