tidb中关于k-v问题

请教一下有人对tikv中的k-v生成这块有了解吗
怎样把建表的表信息转成一个k-v结构
在插入数据的时候,k又是怎样生成,v又是怎样填充的,这个大家有了解吗

可以看看302课程的tidb sever这章,有比较详细的介绍

TiDB 高级系统管理 [TiDB v5](302) (pingcap.com)

1 个赞

版主说的对。

你可以直接开始啃这个系列了。

你要的内容在这篇里面有比较详细的阐述:

分为两种情况,你可以这样理解:
聚簇表的key(RowID)就是tablePrefix{ TablelD }_recordPrefixSep{ Col1 },由表id和主键组成,value就是除主键外所有的其他字段组成的一个json字符串。
非聚簇表的话,他的key都是tablePrefix { TablelD }_recordPrefixSep{ _Tidb_RowlD },就是key都是由表id和_Tidb_RowlD(只有非聚簇表才会自动生成)这个拼接出来的,value就是包括转的所有的字段组成的一个json字符串。
当你通过一个聚簇表的主键来查某个字段的值的时候,可以形成点查,就是你给出的表id和主键id已经可以确定他在tikv中的key,这时,直接到tikv中将对应的value中的对应字段返回给你。
而你通过一个非聚簇表的主键来查某个字段的值的时候,确定不了key,需要通过主键索引先获取到它在tikv中存储的key,然后再通过这个key去tikv中对应的value中的对应字段返回给你。

建表的表信息转成一个k-v结构,简单的说默认情况
key 是table的唯一id+主键字段
value就是值就是数据行存储

如果主是联合索引或者是非聚簇表,那就数据库生成个内部隐藏的_tidb_rowid,bigint类型,作为唯一主键,然后和table的id合并为key

在pd代码中看到
pd中cddec.go

tablePrefix = []byte{‘t’}

recordPrefix = []byte(“_r”)

// GenerateTableKey generates a table split key.

func GenerateTableKey(tableID int64) []byte {

buf := make([]byte, 0, len(tablePrefix)+8)

buf = append(buf, tablePrefix…)

buf = EncodeInt(buf, tableID)

return buf

}

// GenerateRowKey generates a row key.

func GenerateRowKey(tableID, rowID int64) []byte {

buf := make([]byte, 0, len(tablePrefix)+len(recordPrefix)+8*2)

buf = append(buf, tablePrefix…)

buf = EncodeInt(buf, tableID)

buf = append(buf, recordPrefix…)

buf = EncodeInt(buf, rowID)

return buf

}
这俩应该是tabke的key和row key的生成

哈哈,这个key生成应该是在pd_server生成的,目前还在看怎么跟踪go的代码进行调试

1 个赞

正在看,很感谢

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

目前根据代码中留下的文档看到数据组成如下:
TiDB 的数据在 TiKV 那保存的形式是:
Key: tablePrefix{tableID}_recordPrefixSep{rowID}
Value: [col1, col2, col3, col4]

唯一索引
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue //有些文档写的这个,但是是否还用呢?
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKey //不知道哪个对
Value: rowID

非唯一索引
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue_rowID
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKeys_rowID
Value: null

分区表索引
Key: tablePrefix{partitionID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: rowID

关于索引的,不知道两个key哪个是对的
带indexedColumnsValue我看是比较早的,是不是现在不用了,换新新的了呢

1 个赞

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。