filter block结构

讲完了data block,在这一章节将展开讲述filter block的结构。

为了加快sstable中数据查询的效率,在直接查询datablock中的内容之前,leveldb首先根据filterblock中的过滤数据判断指定的datablock中是否有需要查询的数据,若判断不存在,则无需对这个datablock进行数据查找。

filter block存储的是datablock数据的一些过滤信息。这些过滤数据一般指代布隆过滤器的数据,用于加快查询的速度,关于布隆过滤器的详细内容,可以见《Leveldb源码分析- 布隆过滤器》。

filter block结构 - 图1

filter block存储的数据主要可以分为两部分:(1)过滤数据(2)索引数据。

其中索引数据中,filter i offset表示第i个filter data在整个filterblock中的起始偏移量,filter offset's offset表示filterblock的索引数据在filter block中的偏移量。

在读取filterblock中的内容时,可以首先读出filter offset's offset的值,然后依次读取filter i offset,根据这些offset分别读出filter data

Base Lg默认值为11,表示每2KB的数据,创建一个新的过滤器来存放过滤数据。

一个sstable只有一个filter block,其内存储了所有block的filter数据.具体来说,filter_data_k 包含了所有起始位置处于 [basek,base(k+1)]范围内的block的key的集合的filter数据,按数据大小而非block切分主要是为了尽量均匀,以应对存在一些block的key很多,另一些block的key很少的情况。

注解

leveldb中,特殊的sstable文件格式设计简化了许多操作,例如:

索引和BloomFilter等元数据可随文件一起创建和销毁,即直接存在文件里,不用加载时动态计算,不用维护更新