YugabyteDB YCQL自定义类型(UDT)在底层RocksDB的存储机制是怎样的?
YCQL自定义类型(UDT)的RocksDB底层存储逻辑
- 执行
CREATE TYPE语句定义UDT时,UDT的元数据(所属键空间、类型名、字段列表、字段顺序、各字段对应数据类型)会持久化存储到系统表system_schema.types中。这部分元数据和其他系统表数据的存储逻辑一致,存放在负责系统表的对应RocksDB实例里,以「键空间名+UDT类型名」作为主键索引。 - 业务表使用该UDT作为列类型写入数据时,YCQL层会先将UDT的所有字段值严格按照定义时的固定顺序做序列化,整个序列化过程不会存储冗余的字段名称,仅保留字段值的二进制内容。
- 序列化完成的UDT二进制块会作为单个列值,和该行的其他普通列值一同拼装到RocksDB的Value部分存储,不会把UDT的每个字段拆分为独立的RocksDB键值对。
- 如果是嵌套UDT结构(即UDT的某个字段本身也是另一个UDT类型),会按嵌套层级递归序列化,最终合并为单个连续二进制块存储。
- 即使UDT的部分字段赋值为NULL,序列化时也会按定义顺序保留对应的占位标识,不会省略NULL字段的位置信息,反序列化时无需额外查询UDT元数据即可按顺序还原所有字段的取值。
内容的提问来源于stack exchange,提问作者dh YB
相关产品推荐
相关产品推荐

