SHARD_ROW_ID_BITS
本文介绍 SHARD_ROW_ID_BITS 表属性,用于设置隐式 _tidb_rowid 分片后分片的位数。
概念
对于没有聚簇主键或没有主键的表,TiDB 会使用自动生成的 _tidb_rowid 作为隐式自增行 ID。当执行大量 INSERT 操作时,数据会写入到单个 Region,导致写入热点问题。
为缓解热点问题,你可以配置 SHARD_ROW_ID_BITS。行 ID 会被打散,数据会写入到多个不同的 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 位 | S 位 | 63-S 位 |
- 自增位的值存储在 TiKV 中,并按顺序分配。每次分配一个值,下一个值递增 1。当自增位的值被耗尽(即达到最大值时),后续的自动分配会失败,并报错
Failed to read auto-increment value from storage engine。 _tidb_rowid的取值范围:最终生成值的最大位数 = 分片位数 + 自增位数,因此最大值为(2^63)-1。
Warning
_tidb_rowid是 TiDB 隐式分配的内部行 ID。不要假设它在所有情况下都是全局唯一的。对于未使用聚簇索引的分区表,ALTER TABLE ... EXCHANGE PARTITION可能导致不同分区存在相同的_tidb_rowid值。详情参见_tidb_rowid。
Note
分片位(
S)的选择:
- 由于
_tidb_rowid总位数为 64,分片位数会影响自增位数:分片位数增加时,自增位数减少,反之亦然。因此,你需要在自增值的随机性和可用自增空间之间进行权衡。- 最佳实践是将分片位设置为
log(2, x),其中x为集群中的 TiKV 节点数。例如,如果 TiDB 集群有 16 个 TiKV 节点,建议将分片位设置为log(2, 16),即4。当所有 Region 被均匀调度到每个 TiKV 节点后,大批量写入的负载可以均匀分布到不同的 TiKV 节点,从而最大化资源利用率。
关于用法详情,参见 热点问题排查指南。
示例
CREATE TABLE t (
id INT PRIMARY KEY NONCLUSTERED
) SHARD_ROW_ID_BITS = 4;ALTER TABLE t SHARD_ROW_ID_BITS = 4;