分区表的疑问

对于分区表数据的存储方式,tikv内部是先划分出region再按照分区键分区,还是按分区创建各自的region?

看官方文档是先分区,再分region

哪里有写?

是 先按分区映射成独立物理对象,再在每个分区内部继续切 Region,不是“先全表统一切 Region,再在 Region 里按分区键分区”。

3 个赞

假设有表:

create table orders (
id bigint,
dt date
)
partition by range columns(dt) (
partition p202401 values less than (‘2024-02-01’),
partition p202402 values less than (‘2024-03-01’),
partition pmax values less than (maxvalue)
);

在存储层更像是:

orders.p202401 是一个物理对象

orders.p202402 是一个物理对象

orders.pmax 是一个物理对象

然后:

p202401 里的数据多了,会分裂出多个 Region

p202402 里的数据多了,也会分裂出多个 Region

pmax 也是一样

所以不是“整个 orders 表共用一套先验 Region 再做分区判断”。

3 个赞

TiKV 始终先按 Key 范围划分 Region,分区表的分区键会编码到 Key 中,让分区成为 Region Key 范围的天然边界,但不会为每个分区 “专属创建” Region

1 个赞

https://docs.pingcap.com/tidb/dev/sql-statement-split-region/

多谢!也就是说如果分区列用HASH分区的话,主键列即便是自增也一样能起到打散热点的效果了。

tikv 可以理解成从 负无穷到正无穷的 key 区间,划分成一个个的region。
tidb 在这个kv的上面构造表结构之类的。
每个表不同的前缀。

可以一个设置:每个表强行一个region。这样就相当于用表前缀为界限分割region

1 个赞

是的,但是分区足够大之后才会region分裂

分区是个逻辑概念,数据存在分片region中。这样就好理解了。

每个分区表实际上各自都有表的id,相当于每个分区是一个表

region可以默认吗

1 个赞

TiKV 不是按分区创建各自独立的 Region,而是先按 Key Range 划分出 Region,再将分区表的不同分区数据映射到对应的 Region 中。

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