SHARD_ROW_ID_BITS怎么理解

SHARD_ROW_ID_BITS是不是非聚簇表按_tidb_rowid的hash打散的2^n桶数?为什么我设置为4了还是只占一个region?

set @@cte_max_recursion_depth =100000;
drop table t1;
CREATE TABLE t1 (c int,c2 varchar(100)) SHARD_ROW_ID_BITS = 4;
insert into t1
WITH RECURSIVE nr(n) AS
    (SELECT 1                               
      UNION ALL SELECT n + 1                
      FROM nr WHERE n < 100000            
    ) SELECT n,'abcdefgabcdefgabcdefgabcdefgabcdefg' FROM nr;
   

这样只查到一个region:

SHOW TABLE t1 regions;
REGION_ID|START_KEY|END_KEY |LEADER_ID|LEADER_STORE_ID|PEERS       |SCATTERING|WRITTEN_BYTES|READ_BYTES|APPROXIMATE_SIZE(MB)|APPROXIMATE_KEYS|SCHEDULING_CONSTRAINTS|SCHEDULING_STATE|
---------+---------+--------+---------+---------------+------------+----------+-------------+----------+--------------------+----------------+----------------------+----------------+
       52|t_125_   |78000000|       53|              1|53, 174, 238|         0|     27112746|   1515420|                  71|          623656|                      |                |
      

select _tidb_rowid,c,c2 from t1; 
_tidb_rowid        |c  |c2                                 |
-------------------+---+-----------------------------------+
8070450532247928833|  1|abcdefgabcdefgabcdefgabcdefgabcdefg|
8070450532247928834|  2|abcdefgabcdefgabcdefgabcdefgabcdefg|
8070450532247928835|  3|abcdefgabcdefgabcdefgabcdefgabcdefg|
...

查到了,还要加pre_split_regions属性:

CREATE TABLE t1 (c int,c2 varchar(100)) 
SHARD_ROW_ID_BITS = 4 pre_split_regions=2;
1 个赞

SHARD_ROW_ID_BITS 参数的作用就是定义了 ROW_ID 中用于表示分片 ID 的位数,帮助 TiDB 进行分片表的数据分布和管理。

1 个赞

SHARD_ROW_ID_BITS 参数的作用就是定义了 ROW_ID 中用于表示分片 ID 的位数,注意它是2的冪数

手动挡,,

手动切换 region 数据的分片,避免出现热点问题…

学习了,建表时进行预拆分

菜鸟路过学习一下。

主要避免写热点,必须业务是顺序写,但是打散后,读的性能也会有下降,这需要自己平衡了

提升写入性能,避免只写一个region造成特点,注意这个只能在建表阶段做

https://docs.pingcap.com/zh/tidb/stable/shard-row-id-bits#shard_row_id_bits

必须要加这个参数吗? 是不是数据量大的时候SHARD_ROW_ID_BITS = 4 才会按2的4次方分region?

我插了几十万还在一个region上

感谢各位的回复🙏

SHARD_ROW_ID_BITS 用于将 _tidb_rowid 列生成的行 ID 随机打散。PRE_SPLIT_REGIONS 用于在建完表后预先进行 Split region。

示例:

--PRE_SPLIT_REGIONS 的值必须小于或等于 SHARD_ROW_ID_BITS。
create table t (a int, b int) SHARD_ROW_ID_BITS = 4 PRE_SPLIT_REGIONS=3;
  • SHARD_ROW_ID_BITS = 4 表示 tidb_rowid 的值会随机分布成 16 (16=2^4) 个范围区间。
  • PRE_SPLIT_REGIONS=3 表示建完表后提前切分出 8 (2^3) 个 Region。

开始写数据进表 t 后,数据会被写入提前切分好的 8 个 Region 中,这样也避免了刚开始建表完后因为只有一个 Region 而存在的写热点问题。

TiDB 高并发写入场景最佳实践 | PingCAP 文档中心

是的,这个打散虽然避免了写热点,一定程度提升了写性能,但是读的性能也会明显下降,这也是我们一直没有使用该参数的原因,很难权衡利弊。

菜鸟路过学习下

使用AUTO_RANDOM,立竿见影看到数据分布在多个region里

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