From c7f98fe0c1ccd9fb1af2ebb9c71d8682c381401d Mon Sep 17 00:00:00 2001 From: djshow832 Date: Thu, 24 Jul 2025 22:31:21 +0800 Subject: [PATCH 1/4] shard id --- shard-row-id-bits.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/shard-row-id-bits.md b/shard-row-id-bits.md index 5357605065b4..49e21b9e3129 100644 --- a/shard-row-id-bits.md +++ b/shard-row-id-bits.md @@ -17,6 +17,22 @@ summary: 介绍 TiDB 的 `SHARD_ROW_ID_BITS` 表属性。 - `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 | + +- 自增位的值保存在存储引擎中,按顺序分配,每次分配完值后会自增 1。自增位保证了 `_tidb_rowid` 列值全局唯一。当自增位耗尽后,再次自动分配时会报 `Failed to read auto-increment value from storage engine` 的错误。 +- 关于取值范围:最终生成值包含的最大位数 = 分片位 + 自增位,最大值为 `(2^63)-1`。 + +> **注意:** +> +> 分片位长度 (`S`) 的选取: +> +> - 由于总位数固定为 64 位,分片位的数量会影响到自增位的数量:当分片位数增加时,自增位数会减少,反之亦然。因此,你需要权衡“自动分配值的随机性”以及“可用空间”。 +> - 最佳实践是将分片位设置为 `log(2, x)`,其中 `x` 为当前集群存储引擎的数量。例如,一个 TiDB 集群中存在 16 个 TiKV,分片位可以设置为 `log(2, 16)`,即 `4`。在所有 Region 被均匀调度到各个 TiKV 上以后,此时大批量写入的负载可被均匀分布到不同 TiKV 节点,以实现资源最大化利用。 + 关于 `SHARD_ROW_ID_BITS` 的更多使用信息,可参考[使用 SHARD_ROW_ID_BITS 处理热点表](/troubleshoot-hot-spot-issues.md#使用-shard_row_id_bits-处理热点表)。 ## 语句示例 From 26d85ae0449e4f03b62d985f2cea1c52bacfedff Mon Sep 17 00:00:00 2001 From: djshow832 Date: Sat, 26 Jul 2025 09:37:58 +0800 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Grace Cai --- shard-row-id-bits.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shard-row-id-bits.md b/shard-row-id-bits.md index 49e21b9e3129..60f31d5ca1b5 100644 --- a/shard-row-id-bits.md +++ b/shard-row-id-bits.md @@ -23,15 +23,15 @@ summary: 介绍 TiDB 的 `SHARD_ROW_ID_BITS` 表属性。 |--------|--------|--------------| | 1 bit | `S` bits | `63-S` bits | -- 自增位的值保存在存储引擎中,按顺序分配,每次分配完值后会自增 1。自增位保证了 `_tidb_rowid` 列值全局唯一。当自增位耗尽后,再次自动分配时会报 `Failed to read auto-increment value from storage engine` 的错误。 -- 关于取值范围:最终生成值包含的最大位数 = 分片位 + 自增位,最大值为 `(2^63)-1`。 +- 自增位的值保存在 TiKV 中,由 TiKV 按顺序分配,每次分配后值会自增 1。自增位确保了 `_tidb_rowid` 列值全局唯一。当自增位的值耗尽后(即达到最大值时),再次自动分配时会报 `Failed to read auto-increment value from storage engine` 错误。 +- 关于 `_tidb_rowid` 取值范围:最终生成值包含的最大位数 = 分片位 + 自增位,最大值为 `(2^63)-1`。 > **注意:** > > 分片位长度 (`S`) 的选取: > -> - 由于总位数固定为 64 位,分片位的数量会影响到自增位的数量:当分片位数增加时,自增位数会减少,反之亦然。因此,你需要权衡“自动分配值的随机性”以及“可用空间”。 -> - 最佳实践是将分片位设置为 `log(2, x)`,其中 `x` 为当前集群存储引擎的数量。例如,一个 TiDB 集群中存在 16 个 TiKV,分片位可以设置为 `log(2, 16)`,即 `4`。在所有 Region 被均匀调度到各个 TiKV 上以后,此时大批量写入的负载可被均匀分布到不同 TiKV 节点,以实现资源最大化利用。 +> - 由于 `_tidb_rowid` 总位数为 64 位,分片位的数量会影响自增位的数量:当分片位数增加时,自增位数会减少,反之亦然。因此,你需要权衡“自动分配值的随机性”以及“可用自增空间”。 +> - 最佳实践是将分片位设置为 `log(2, x)`,其中 `x` 为当前集群中 TiKV 节点的数量。例如,如果一个 TiDB 集群中存在 16 个 TiKV 节点,分片位推荐设置为 `log(2, 16)`,即 `4`。在所有 Region 被均匀调度到各个 TiKV 节点后,此时大批量写入操作的负载可被均匀分布到不同 TiKV 节点,以实现资源最大化利用。 关于 `SHARD_ROW_ID_BITS` 的更多使用信息,可参考[使用 SHARD_ROW_ID_BITS 处理热点表](/troubleshoot-hot-spot-issues.md#使用-shard_row_id_bits-处理热点表)。 From 1f81586d5a79dfa8be57894dc49f9d0eeaaaf10a Mon Sep 17 00:00:00 2001 From: djshow832 Date: Mon, 28 Jul 2025 15:35:23 +0800 Subject: [PATCH 3/4] Apply suggestions from code review Co-authored-by: tangenta --- shard-row-id-bits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shard-row-id-bits.md b/shard-row-id-bits.md index 60f31d5ca1b5..3a4fa6d3d000 100644 --- a/shard-row-id-bits.md +++ b/shard-row-id-bits.md @@ -23,7 +23,7 @@ summary: 介绍 TiDB 的 `SHARD_ROW_ID_BITS` 表属性。 |--------|--------|--------------| | 1 bit | `S` bits | `63-S` bits | -- 自增位的值保存在 TiKV 中,由 TiKV 按顺序分配,每次分配后值会自增 1。自增位确保了 `_tidb_rowid` 列值全局唯一。当自增位的值耗尽后(即达到最大值时),再次自动分配时会报 `Failed to read auto-increment value from storage engine` 错误。 +- 自增位的值保存在 TiKV 中,TiDB 按顺序分配,每次分配后值会自增 1。自增位确保了 `_tidb_rowid` 列值全局唯一。当自增位的值耗尽后(即达到最大值时),再次自动分配时会报 `Failed to read auto-increment value from storage engine` 错误。 - 关于 `_tidb_rowid` 取值范围:最终生成值包含的最大位数 = 分片位 + 自增位,最大值为 `(2^63)-1`。 > **注意:** From 8570d0d9628658b22c2a406170afd572381f6aab Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Thu, 14 Aug 2025 08:12:47 +0800 Subject: [PATCH 4/4] Update shard-row-id-bits.md Co-authored-by: Aolin --- shard-row-id-bits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shard-row-id-bits.md b/shard-row-id-bits.md index 3a4fa6d3d000..70a83f4d6db3 100644 --- a/shard-row-id-bits.md +++ b/shard-row-id-bits.md @@ -23,7 +23,7 @@ summary: 介绍 TiDB 的 `SHARD_ROW_ID_BITS` 表属性。 |--------|--------|--------------| | 1 bit | `S` bits | `63-S` bits | -- 自增位的值保存在 TiKV 中,TiDB 按顺序分配,每次分配后值会自增 1。自增位确保了 `_tidb_rowid` 列值全局唯一。当自增位的值耗尽后(即达到最大值时),再次自动分配时会报 `Failed to read auto-increment value from storage engine` 错误。 +- 自增位的值保存在 TiKV 中,由 TiDB 按顺序分配,每次分配后值会自增 1。自增位确保了 `_tidb_rowid` 列的值全局唯一。当自增位的值耗尽后(即达到最大值时),再次自动分配时会报 `Failed to read auto-increment value from storage engine` 错误。 - 关于 `_tidb_rowid` 取值范围:最终生成值包含的最大位数 = 分片位 + 自增位,最大值为 `(2^63)-1`。 > **注意:**