shard_row_id_bits & pre_split_regions

shard_row_id_bits
    本文介绍表属性 shard_row_id_bits,它用来设置隐式 _tidb_rowid 分片数量的 bit 位数。

基本概念
对于非整数主键或没有主键的表,TiDB 会使用一个隐式的自增 rowid。大量执行 INSERT 插入语句时会把数据集中写入单个 Region,造成写入热点。
通过设置 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 个分片

语句示例
CREATE TABLECREATE TABLE t (c int) shard_row_id_bits = 4;
ALTER TABLEALTER TABLE t shard_row_id_bits = 4;







pre_split_regions
    使用带有 shard_row_id_bits 的表时,如果希望建表时就均匀切分 Region,可以考虑配合 pre_split_regions 一起使用,用来在建表成功后就开始预均匀切分 2^(PRE_SPLIT_REGIONS) 个 Region。

注意:
pre_split_regions 必须小于等于 shard_row_id_bits。

以下全局变量会影响 pre_split_regions 的行为,需要特别注意:
tidb_scatter_region:该变量用于控制建表完成后是否等待预切分和打散 Region 完成后再返回结果。如果建表后有大批量写入,需要设置该变量值为 1,表示等待所有 Region 都切分和打散完成后再返回结果给客户端。否则未打散完成就进行写入会对写入性能影响有较大的影响。

示例
create table t (a int, b int,index idx1(a)) shard_row_id_bits = 4 pre_split_regions=2;
该语句在建表后,会对这个表 t 预切分出 4 + 1 个 Region。4 (2^2) 个 Region 是用来存 table 的行数据的,1 个 Region 是用来存 idx1 索引的数据。
4table Region 的范围区间如下:
region1:   [ -inf      ,  1<<61 )
region2:   [ 1<<61     ,  2<<61 )
region3:   [ 2<<61     ,  3<<61 )
region4:   [ 3<<61     ,  +inf  )



[root@10.0.0.11:4000] [(none)]> show global variables like "%scatter%";
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| tidb_scatter_region | 0     |
+---------------------+-------+
1 row in set (0.00 sec)

[root@10.0.0.11:4000] [(none)]> set global tidb_scatter_region=1;
Query OK, 0 rows affected (0.01 sec)
原文地址:https://www.cnblogs.com/zhouwanchun/p/13841855.html