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修复值
代码:
调试验证如图
索引的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列数据从原始类型进行了转换,成为存储的类型,转换前和转换后结果如图所示:
其中转换后的数据类型具体代表如下图所示:
第一次发这种干货技术贴,还望大家多多指教