SHARD_ROW_ID_BITS
本文介绍表属性 SHARD_ROW_ID_BITS
,它用来设置隐式 _tidb_rowid
分片数量的 bit 位数。
基本概念
对于非聚簇索引主键或没有主键的表,TiDB 会使用一个隐式的自增 rowid。大量执行 INSERT
插入语句时会把数据集中写入单个 Region,造成写入热点。
通过设置 SHARD_ROW_ID_BITS
,可以把 rowid 打散写入多个不同的 Region,缓解写入热点问题。
SHARD_ROW_ID_BITS = 4
表示 16 个分片SHARD_ROW_ID_BITS = 6
表示 64 个分片SHARD_ROW_ID_BITS = 0
表示默认值 1 个分片
设置 SHARD_ROW_ID_BITS = S
时,_tidb_rowid
的具体结构如下:
符号位 | 分片位 | 自增位 |
---|---|---|
1 bit | S bits | 63-S bits |
- 自增位的值保存在 TiKV 中,由 TiDB 按顺序分配,每次分配后值会自增 1。自增位确保了
_tidb_rowid
列的值全局唯一。当自增位的值耗尽后(即达到最大值时),再次自动分配时会报Failed to read auto-increment value from storage engine
错误。 - 关于
_tidb_rowid
取值范围:最终生成值包含的最大位数 = 分片位 + 自增位,最大值为(2^63)-1
。
关于 SHARD_ROW_ID_BITS
的更多使用信息,可参考使用 SHARD_ROW_ID_BITS 处理热点表。
语句示例
CREATE TABLE t (
id INT PRIMARY KEY NONCLUSTERED
) SHARD_ROW_ID_BITS = 4;
ALTER TABLE t SHARD_ROW_ID_BITS = 4;