filter block结构
讲完了data block,在这一章节将展开讲述filter block的结构。
为了加快sstable中数据查询的效率,在直接查询datablock中的内容之前,leveldb首先根据filterblock中的过滤数据判断指定的datablock中是否有需要查询的数据,若判断不存在,则无需对这个datablock进行数据查找。
filter block存储的是datablock数据的一些过滤信息。这些过滤数据一般指代布隆过滤器的数据,用于加快查询的速度,关于布隆过滤器的详细内容,可以见《Leveldb源码分析- 布隆过滤器》。
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等元数据可随文件一起创建和销毁,即直接存在文件里,不用加载时动态计算,不用维护更新