TiDB 索引结构是怎么存储的,是会在rocksdb新建一个列簇吗?

索引数据的KV映射
对于普通索引,在MySQL中是有非聚集索引概念的,尤其innodb中,通过B+Tree形式,子节点记录主键信息,再通过回表方式得到结果数据。
在Tidb中是支持创建索引的,那么索引信息如何存储? 它同时支持主键和二级索引(包括唯一索引和非唯一索引),且与表数据映射方式类似。
设计如下:
Tidb为表中每个索引,分配了一个索引ID,用IndexID表示。
对于主键和唯一索引,需要根据键值快速定位到RowID,这个会存储到value中
因此生成的key-value键值对为:
Key:tablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue
Value: RowID
由于设计的key中存在indexedColumnsValue,也就是查询的字段值,因此可以直接命中或模糊检索到。再通过value中的RowID,去表数据映射中,检索到RowID对应的行记录。
对于普通索引,一个键值可能对应多行,需要根据键值范围查询对应的RowID。
Key: tablePrefix{TableID}_indexPrefixSep{IndexID}indexedColumnsValue{RowID}
Value: null
根据字段值,可以检索到具有相关性的key的列表,在根据key中包含的RowID,再拿到行记录。