B-tree 靠一個節點放多個鍵把樹壓矮,換到更少的讀取次數

索引是一個排序過的資料結構,裡面帶著指向資料的 pointer。沒有索引時搜尋只能 linear search,時間複雜度 O(n);建了 B+ tree 索引之後是 O(log N)。

換成二元搜尋樹,百萬筆資料只要讀 20 次左右就找得到。那還能再更少嗎?——1971 年 Rudolf Bayer 與 Edward M. McCreight 提出的 B-tree 就是在回答這題。

方法:一個節點不只放一個鍵

B-tree 的特點是每個節點都有多個鍵,而不是一個。鍵變多 → 分支變多 → 同樣的資料量,樹的層數變少。

資料 1~100層數最多讀幾次
平衡二元搜尋樹至少 7 層7
B-tree(每個節點最多 10 個鍵)3 層3

搜尋要讀幾次 = 樹有幾層。 把樹壓矮,就是直接減少讀取次數——這就是選 B-tree/B+ tree 而不是二元搜尋樹的理由。

(可以在 https://btree.app/ 動手建一棵試試。)

代價

建索引要額外的記憶體/儲存空間,所以建之前要評估:寫大於讀的情況就不適合建——這筆交易的完整帳見 索引是拿寫入換查詢,寫多讀少的表加索引是純虧。

相關:全表掃描和索引掃描的適用場景是相反的(沒有索引時就是那個 O(n))