tidb的k-v结构

Tidb中k-v生成方式

Tidb中数据最终是存储在tikv(底层是rocksdb)。因此我们需要了解存储的时候,kv的实现。

k-v主要是包含几种

创建表

表的key构成,参考EncodeTablePrefix

key长度为9

将前面生成的唯一的tablid进行处理,前面添加t,唯一id产生函数:assignTableID

组成:ttableid

代码:


往表插入数据形成的k-v

Key: tablePrefix{tableID}_recordPrefixSep{rowID}

Byte 1 2-9 10-11 12-19
value t tableid _r rowid

Value: [col1, col2, col3, col4]

Key分为两部分,tabblid和rowid修复值

代码:
image
image


调试验证如图

索引的k-v

索引分为两种:

唯一索引

Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue

Value: rowID

非唯一索引

根据具体分析可以得出key的组成如下

Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID

byte 1 2-9 10-11 12-19 20 21-28 29 30-37
value t tableid _i indexID ValueType indexvalue valueFlag rowid

Value: null

代码调试验证

说明:

116:‘t’ tablePrefix

128,0,0,0,0,0,0,107:表id,该表id是107, 128是做了一个无符号转换

参考:EncodeIntToCmpUint函数 uint64(v) ^ 0x8000000000000000

95,105:‘_i’ indexPrefixSep

128,0,0,0,0,0,0,1: indexID

3: 值的类型

128,0,0,0,0,0,0,2: vale

3:rowid的类型 intFlag

128,0,0,0,0,1,95,146: rowid

分区索引

Key: tablePrefix{partitionID}_indexPrefixSep{indexID}_indexedColumnsValue

Value: rowID

关于数据存储:数据存储的时候是按照datum类型进行存储的

用一个例子来进行说明:

create table t4(c1 varchar(20), c2 int, c3 double, c4 float);

insert into t4 values(‘hello’, 1, 1.2345, 6.7890);

当我们插入数据的时候,对应的4列数据从原始类型进行了转换,成为存储的类型,转换前和转换后结果如图所示:




其中转换后的数据类型具体代表如下图所示:

第一次发这种干货技术贴,还望大家多多指教

4 个赞

:+1: :+1: :+1:

受教了

:call_me_hand: :call_me_hand: :call_me_hand:

学习了

源码解读,这是一个很好的技术分享,赞一个