请教一下有人对tikv中的k-v生成这块有了解吗
怎样把建表的表信息转成一个k-v结构
在插入数据的时候,k又是怎样生成,v又是怎样填充的,这个大家有了解吗
版主说的对。
你可以直接开始啃这个系列了。
你要的内容在这篇里面有比较详细的阐述:
分为两种情况,你可以这样理解:
聚簇表的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的代码进行调试
正在看,很感谢
目前根据代码中留下的文档看到数据组成如下:
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我看是比较早的,是不是现在不用了,换新新的了呢
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。