data block结构
data block中存储的数据是leveldb中的keyvalue键值对。其中一个datablock中的数据部分(不包括压缩类型、CRC校验码)按逻辑又以下图进行划分:
第一部分用来存储keyvalue数据。由于sstable中所有的keyvalue对都是严格按序存储的,用了节省存储空间,leveldb并不会为每一对keyvalue对都存储完整的key值,而是存储与上一个key非共享的部分,避免了key重复内容的存储。
每间隔若干个keyvalue对,将为该条记录重新存储一个完整的key。重复该过程(默认间隔值为16),每个重新存储完整key的点称之为Restartpoint。
注解
leveldb设计Restartpoint的目的是在读取sstable内容时,加速查找的过程。
由于每个Restartpoint存储的都是完整的key值,因此在sstable中进行数据查找时,可以首先利用restartpoint点的数据进行键值比较,以便于快速定位目标数据所在的区域;
当确定目标数据所在区域时,再依次对区间内所有数据项逐项比较key值,进行细粒度地查找;
该思想有点类似于跳表中利用高层数据迅速定位,底层数据详细查找的理念,降低查找的复杂度。
每个数据项的格式如下图所示:
一个entry分为5部分内容:
- 与前一条记录key共享部分的长度;
- 与前一条记录key不共享部分的长度;
- value长度;
- 与前一条记录key非共享的内容;
- value内容;例如:
- restart_interval=2
- entry one : key=deck,value=v1
- entry two : key=dock,value=v2
- entry three: key=duck,value=v3
三组entry按上图的格式进行存储。值得注意的是restart_interval为2,因此每隔两个entry都会有一条数据作为restartpoint点的数据项,存储完整key值。因此entry3存储了完整的key。
此外,第一个restart point为0(偏移量),第二个restart point为16,restartpoint共有两个,因此一个datablock数据段的末尾添加了下图所示的数据:
尾部数据记录了每一个restart point的值,以及所有restart point的个数。