-
Notifications
You must be signed in to change notification settings - Fork 8
SingleFastTable
rockeet edited this page Oct 31, 2025
·
8 revisions
SingleFastTable 使用 CSPPTrie 存储索引和数据,不执行任何压缩,目的是提供最高的读写性能,主要将它通过 DispatchTable 配置在 LSM 的较上层,相应的 Flush/Compact 在 DB 结点上执行。
相比 ToplingFastTable(已退役),SingleFastTable 只有一个 cspp 对象,结构更简单,速度也更快一丢丢。
SingleFastTable 是通过 SidePlugin 进行配置的,在(yaml)配置文件中,举例如下:
fast: SingleFastTable # 简单配置的 简化版配置语法
fast2: # 完整版配置语法
class: SingleFastTable
params: # 即便用完整版配置语法,params 也可以省略
# RocksDB 自身的 write 有很大的性能损失,ToplingDB 性能太高,此损失难以接受
# {kRocksdbNative, kToplingMmapWrite, kToplingFileWrite}
writeMethod: kToplingFileWrite # 默认 kToplingFileWrite
fileWriteBufferSize: 16K # default 8K
# 默认 true, false 表示仅随机抽取 key,anchor.size 按均分填入,忽略实际尺寸,不建议
accurateKeyAnchorsSize: true
# 仅当 accurateKeyAnchorsSize 为 true 时有效
# default 0, ApproximateKeyAnchors: 每个 key 覆盖多大 SST 尺寸(字节数)
# default 0 表示 ApproximateKeyAnchors 最多返回 256 个 Anchor(ukey, size)
keyAnchorSizeUnit: 100K
warmupLevel: kValue # {kNone,kIndex,kValue} 默认 kValue 表示 Open SST 时读入全部内容
useFilePreallocation: true # 默认 true, 表示创建 SST 时预分配文件空间
# sst 中 value 的平均长度满足条件时,使用 pread,否则使用 mmap
minPreadLen: -1 # 默认 -1, 表示不使用 pread
maxPreadLen: 32K # 除作为 pread 条件之外,使用 mmap 且当前 value 大于该配置时,执行 madivise(POPULATE_READ)
minPreadLevel: 1 # 当 sst 在 LSM 中所处的 level 大于等于该配置时,使用 pread
debugLevel: 0 # 默认 0底层 cspptrie 可以认为是一个 map<string, POD_Value>,SingleFastTable 的 POD_Value 是个结构体:
#pragma pack(push,4)
struct TopFastIndexEntry {
// seqvt: SequenceNumber and ValueType
uint64_t seqvt;
uint32_t valuePos;
uint32_t valueLen : 31;
uint32_t valueMul : 1;
};
#pragma pack(pop)SST 逻辑上是个 map<string, map<seqvt, value>>,其中大部分 map<seqvt, value> 实际上只有一条{seqvt, value}。
valueMul 就是用来标记是多条还是一条,只有一条数据的情况下,用 valuePos 和 valueLen 直接访问 Value,有多条数据的情况下稍微复杂一点 :
-
$$TopFastIndexEntry.valueLen$$ 表示数据条数 n -
$$TopFastIndexEntry.valuePos$$ 指向元数据区,包含 seqvt 数组和$$\lbrace{ValuePos,ValueLen}\rbrace$$ 数组 -
$$TopFastIndexEntry.seqvt$$ 是第一条数据的 seqvt,剩余的$$n-1$$ 条放在元数据区的 seqvt 数组中 - 需要注意的是:元数据区 seqvt 数组的长度是
$$n-1$$ ,$$\lbrace{ValuePos,ValueLen}\rbrace$$ 数组的长度是 n