表的一行数据是否会存在两个纬度不一样的Region中

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.0
  • 【问题描述】:

一个表中有主键、name字段、code。其中name是有索引的。

然而 key 由 table_id、主键rowid管理一行数据,value为数据,由Region管理。

索引数据的 key 由 table_id、index_id 以及索引列的值编码,value为数据,也由Region管理。

我所理解第一个Region管理主键纬度,第二个Region管理索引纬度。value是真实数据。

  1. 那这表的同一行数据存在两个Region里面吗?

  2. 这是不是意味着表的一行数据,会存两次?如果是的话,那增加索引就会增加region了。就会增加磁盘的消耗,本来一亿数据变两亿是吗?

  3. 如果没有走索引和主键来select ,那会使用哪个Region

  4. 修改一行数据是不是会更新存在的两个Region中这个数据,他们是怎么实现同时更新两个Region里的相同数据的?

  1. 一行数据不会存在两个region,你的意思是一行记录和一行索引吧,那有可能会在两个region,一般都在一个region
  2. 可以这么说,和其他数据库类似,索引会占用存储空间
  3. 表的那个region
  4. 会同时更新,从索引和行的key就可以看出可以找到他们的关联关系.

大致了解了。那确认一下,存索引的Region里,Map的key是 table_id、index_id 以及索引列的值编码,value是真正数据,还是指向真正数据的地址?

您好,

1.如果满足唯一性约束的主键或者唯一索引,kv 编码形式:

Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
Value: RowID

key 的组成可以满足唯一性要求,所以 value 对应的是 rowid

2.如果该索引仅仅是一个非唯一的二级索引,他得索引结构为

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

所以 value 为空,因为已经可以通过 key 来判断索引数据了。

推荐看下 48h 硬核 book,《TiDB in Action》:
https://book.tidb.io/session1/chapter3/tidb-kv-to-relation.html

1赞