SHARD_ROW_ID_BITS和pre_split_regions原理不太清楚

通过设置 SHARD_ROW_ID_BITS ,可以把 rowid 打散写入多个不同的 Region,缓解写入热点问题。但是设置的过大会造成 RPC 请求数放大,增加 CPU 和网络开销。

  • SHARD_ROW_ID_BITS = 4 表示 16 个分片
  • SHARD_ROW_ID_BITS = 6 表示 64 个分片
  • SHARD_ROW_ID_BITS = 0 表示默认值 1 个分片

这里的分片和region是一个概念吗?假如我有3个tikv,我会产生16个region,然后region会均匀的分配到3个tikv上?
那为什么还要搭配pre_split_regions呢?
create table test_shard (a int, b int,index idx1(a)) shard_row_id_bits = 4 pre_split_regions=2;
我已经可以用shard_row_id_bits切分region啦,那我这样还要执行pre_split_regions切分region,shard_row_id_bits和pre_split_region都是切分region?总是感觉和前面的概念混乱?可以帮忙解释下吗?

  • SHARD_ROW_ID_BITS = 4 表示 16 个分片
  • SHARD_ROW_ID_BITS = 6 表示 64 个分片
  • SHARD_ROW_ID_BITS = 0 表示默认值 1 个分片

这三个参数是,都是以 2 X 次方来表示的
分片的单位就是region,以region 进行分片,pre_split_regions 预切分的分片数量

SHARD_ROW_ID_BITS 是以打散 Row ID 来实现 热点切分,以求避免热点读和热点写,将数据合理的分散到每个region,每个region 合理的分散到 tikv 实例中

如果你用的4.X 或者 5.X 应该已经观察到,除了聚簇索引的支持外,对于自增主键这块也有很好的支持,就是为了解决上面的热点问题

如果你的主键是其他的类型,只能依靠 打散 Row ID,实际上的效果还是比自增要差的

我这样解答,希望能帮到你!

谢谢,我不明白这句话region是怎么分布的?
create table test_shard (a int, b int,index idx1(a)) shard_row_id_bits = 4 pre_split_regions=2;

我有3个tikv,是不是这个是创建了16个分片,每个分片存在4个region均匀的分布在3个tikv上?
如果不是我的region在3个tikv上是怎么分布的呢?

https://docs.pingcap.com/zh/tidb/v5.0/sql-statement-split-region#pre_split_regions

看文档来理解吧,其实文档上写的狠明确了

1 个赞

好的谢谢

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