levelDB immutable Table的文件格式

本文详细介绍了LevelDB中不可变表文件的组织结构。包括数据块、元数据块、索引块等组成部分及其作用。此外还介绍了用于提高查询效率的过滤器块(filter block)和记录统计信息的元数据块(stats metablock)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章是levelDB官方文档的译文,原文地址:Format of an immutable Table file

文件格式概览:
  <beginning_of_file>
  [data block 1]
  [data block 2]
  ...
  [data block N]
  [meta block 1]
  ...
  [meta block K]
  [metaindex block]
  [index block]
  [Footer]        (固定大小; starts at file_size - sizeof(Footer))
  <end_of_file>

文件包含内部指针,每一个这样的指针是一个BlockHandle,包含下面的内容:

  offset:     varint64
  size:       varint64

可以到varints 了解更多关于varint64格式的更多内容。

格式逐一说明:
  1. key/value序列是以有序的方式存储在文件中,并分成一系列的数据块(data block)。从文件文件的开头开始这些数据块一次排列。数据块都是block_builder.cc中指定的格式,并且可以选择是否进行压缩。
  2. 在数据块后面存储的是一些meta块(meta blocks),支持的meta block的类型在后文会说明,以后也会增加更多的meta blocks.每一个meta block也是block_builder.cc中指定的格式,并可选是否压缩。
  3. 一个”metaindex”块。它为(2)中的每一个meta block存储一个entry,其中key是meta block的名称,value是一个指向meta block的BlockHandle指针。
  4. 一个索引块(index block)。它为(1)中的每一个数据块(data block),entry的key是一个大于等于所指向的数据块中的所有数据key,并且小于后一个数据块中数据key的值。value是指向按数据块的BlockHandle指针。
  5. 文件的最后是一个固定长度的Footer。包含metadindex的BlockHandle指针,index Block的BlockHandle指针,还有一个magic number.
       metaindex_handle: char[p];    // Block handle for metaindex
       index_handle:     char[q];    // Block handle for index
       padding:          char[40-p-q]; // zeroed bytes to make fixed length
                                       // (40==2*BlockHandle::kMaxEncodedLength)
       magic:            fixed64;    // == 0xdb4775248b80fb57 (little-endian)
“filter” Meta Block

-如果数据库打开的时候指定了FilterPolicy,那么就会在每个immutable Table里面存储一个filter block。并且metaindex块也会包含一个entry。key是filter.<N>,value是这个fliter block的Block Handle,其中<N>是filter policy的Name()方法返回值。
-filter block存储了一系列的filters,filter i包含了FilterPolicy::CreateFilter()在一个block中偏移在[ i*base … (i+1)*base-1 ]这个范围的所有key的输出。目前,”base”是2KB。所以在例子中,如果block X和block Y在[ 0KB .. 2KB-1 ]这个范围里面,那么X和Y里面的所有key通过调用FilterPolicy::CreateFilter()被转换成一个filter,然后存储在filter block的第一个filter中。
-filter block的格式:

     [filter 0]
     [filter 1]
     [filter 2]
     ...
     [filter N-1]
     [offset of filter 0]                  : 4 bytes
     [offset of filter 1]                  : 4 bytes
     [offset of filter 2]                  : 4 bytes
     ...
     [offset of filter N-1]                : 4 bytes
     [offset of beginning of offset array] : 4 bytes
     lg(base)                              : 1 byte

block末尾的offset数组是一个从数据块偏移量到相应filter的有效映射。

“stats” Meta Block

meta block包含了很多的stats信息。key是静态信息的name,value包含了相应的信息。
TODO(postrelease): record following stats.

  data size
  index size
  key size (uncompressed)
  value size (uncompressed)
  number of entries
  number of data blocks
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值