B-Trees【设计数据密集型应用】

B-Trees

日志结构的索引虽然目前获得承认,可是它不是最多见的索引类型,应用最普遍的索引类型是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的数据)排序

相关文章
相关标签/搜索