二级索引怎么检索行数据

行数据
key:tablePrefix{TableID}_recordPrefixSep{RowID}
Value: [col1, col2, col3, col4]
主键和唯一索引
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: RowID
非唯一索引
Key: tablePrefix{TableID}_indexPrefixSep{IndexID}indexedColumnsValue{RowID}
Value: null
聚簇索引
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: [col1, col2, col3, col4]
tablePrefix = []byte{‘t’}
recordPrefixSep = []byte{‘r’}
indexPrefixSep = []byte{‘i’}
您好有人可以帮忙解答下嘛?
主键检索行数据是根据value拼接查找行数据嘛?[]byte{‘t’}+[]byte{‘r’}+RowID
非唯一索引是截取Key中的RowID然后在进行拼接查询行数据嘛?
如果我创建了聚簇索引和二级索引我的二级索引是的value是存储的什么呢?

2 个赞

https://docs.pingcap.com/zh/tidb/v4.0/tidb-best-practices#二级索引

看下这个是否对你有帮助?

1 个赞

谢谢,这个链接蛮好的,就是有些不明确,只是说根据rowid进行查询行数据,我想知道是不是从非唯一索引的key里面截取rowid然后拼接tablePrefix 和recordPrefixSep 查询行数据呢?

你描述的信息十分具体了,类似下图:

如果从非唯一索引中命中,那么这个索引对应的 Table 和 Row 都明确了

Key:   tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID}

通过这个逻辑关系来回查,就能拿到行数据了

非常感谢,
假如我搜索select * from user where age = 10, 我获取的
二级索引的key是t10_i1_30_3,那我获取行数据的时候是从t10_i1_30_3里面截取rowid3 然后在拼接行数据主键key t10_r3嘛?
我看您上面提供的示例当主键为int类型的时候,tidb还会在创建主键索引吗?是不是行kv对和主键索引kv是一个了,类似于聚簇索引?

嗯,是这样的理解的,根据主键再去取值!

这里要分开理解,5.X 才提供聚簇索引,
3.X 和 4.X 支持到 整数为主键,默认为主索引;
但是如果是其他类型的,就和普通的索引一样,会单独建立索引键值了

2 个赞

谢谢 :smile:

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