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 TABLE:CREATE TABLE t (c int) shard_row_id_bits = 4; ALTER TABLE:ALTER 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 索引的数据。 4 个 table 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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!