日誌結構的索引雖然目前獲得承認,可是它不是最多見的索引類型,應用最普遍的索引類型是B-Tree。算法
在幾乎全部數據庫中B-Tree仍然是索引的標準實現。許多非關係數據庫也在用它。數據庫
像SSTable同樣,B-Tree把鍵值對按照key排序,這樣就保證了鍵值對的高效查詢和範圍查詢(range query)。可是這也是類似之處的結束點:B-Tree的設計哲學很是之不一樣。spa
日誌結構的索引把數據庫劃分紅可變尺寸的segment,通常幾M或更多。按照順序寫每個segment。與之相反的是,B-Tree把劃分紅固定尺寸的block或page,通常4K或更多,一次讀或寫一個page。這種設計與硬件對應的很密切,由於磁盤也是按照固定的尺寸排列的。設計
能夠經過地址或者位置能夠找到一個具體的page,同時一個page也能夠引用另一個page,和指針相似,可是是在磁盤上而不是在內存中。咱們能夠用這些page的引用來構建一棵樹。如圖3-63d
B-Tree中一個page被設計爲root,查詢的時候從root開始。每一個page包含幾個key和子page的reference,每一個子page負責一個連續key的範圍。reference之間的key表示範圍邊界。指針
B-Tree中一個page中的子page的reference的數量叫作branching factor。實戰中,branching factor取決於存儲reference和range邊界的所須要的空間,一般是幾百。日誌
若是你想要更新key對應的值,搜索到葉子page後,直接修改,而後寫回磁盤就能夠了。若是想要添加key,找到範圍包含那個key的page,添加就好了。若是page空間不足,就把那個page分紅兩半,父親page被更新,而且負責新的key範圍的分支。blog
這個算法確保了樹一直保持平衡:一個n個key的B-Tree,其深度是O(logn)。大部分數據庫能夠容納3或4層的B-tree。因此查詢的時候不用遍歷不少的reference。(一個四層4KB的page,branching factor是500的B-tree能夠存儲高達256TB的數據)排序