From c9a0ad3a2c68d89db562e67a94cf44d310b9b94c Mon Sep 17 00:00:00 2001 From: tangenta Date: Fri, 12 Jul 2024 15:28:35 +0800 Subject: [PATCH] update auto-random.md (#17908) --- auto-random.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/auto-random.md b/auto-random.md index ba846b0f0add..060d716594ce 100644 --- a/auto-random.md +++ b/auto-random.md @@ -79,16 +79,23 @@ TiDB 自动分配的 `AUTO_RANDOM(S, R)` 列值共有 64 位: - `S` 表示分片位的数量,取值范围是 `1` 到 `15`。默认为 `5`。 - `R` 表示自动分配值域的总长度,取值范围是 `32` 到 `64`。默认为 `64`。 -`AUTO_RANDOM` 列值的具体结构如下: +有符号位的 `AUTO_RANDOM` 列值的具体结构如下: -| 总位数 | 符号位 | 保留位 | 分片位 | 自增位 | -|---------|----------|-------------|--------|--------------| -| 64 bits | 0/1 bit | (64-R) bits | S bits | (R-1-S) bits | +| 符号位 | 保留位 | 分片位 | 自增位 | +|--------|-------------|--------|--------------| +| 1 bit | `64-R` bits | `S` bits | `R-1-S` bits | -- 符号位的长度由该列是否存在 `UNSIGNED` 属性决定:存在则为 `0`,否则为 `1`。 +无符号位的 `AUTO_RANDOM` 列值的具体结构如下: + +| 保留位 | 分片位 | 自增位 | +|-------------|--------|------------| +| `64-R` bits | `S` bits | `R-S` bits | + +- 是否有符号位取决于该列是否存在 `UNSIGNED` 属性。 - 保留位的长度为 `64-R`,保留位的内容始终为 `0`。 - 分片位的内容通过计算当前事务的开始时间的哈希值而得。要使用不同的分片位数量(例如 10),可以在建表时指定 `AUTO_RANDOM(10)`。 - 自增位的值保存在存储引擎中,按顺序分配,每次分配完值后会自增 1。自增位保证了 `AUTO_RANDOM` 列值全局唯一。当自增位耗尽后,再次自动分配时会报 `Failed to read auto-increment value from storage engine` 的错误。 +- 关于取值范围:最终生成值包含的最大位数 = 分片位 + 自增位。有符号位的列的取值范围是 `[-(2^(R-1))+1, (2^(R-1))-1]`。无符号位的列的取值范围是 `[0, (2^R)-1]`。 > **注意:** > @@ -100,7 +107,7 @@ TiDB 自动分配的 `AUTO_RANDOM(S, R)` 列值共有 64 位: > 值域长度 (`R`) 的选取: > > - 通常,在应用程序的数值类型无法表示完整的 64 位整数时需要设置 `R` 参数。 -> - 例如:JSON number 类型的取值范围为 `[-(2^53)+1, (2^53)-1]`,而 TiDB 很容易会为 `AUTO_RANDOM(5)` 的列分配超出该范围的整数,导致应用程序读取该列的值时出现异常。此时,你可以用 `AUTO_RANDOM(5, 54)` 代替 `AUTO_RANDOM(5)`,使得 TiDB 不会分配出大于 `9007199254740991` (2^53-1) 的整数。 +> - 例如:JSON number 类型的取值范围为 `[-(2^53)+1, (2^53)-1]`,而 TiDB 很容易会为 `AUTO_RANDOM(5)` 的列分配超出该范围的整数,导致应用程序读取该列的值时出现异常。此时,对于有符号的列你可以用 `AUTO_RANDOM(5, 54)` 代替 `AUTO_RANDOM(5)`,无符号列可以用 `AUTO_RANDOM(5, 53)` 代替 `AUTO_RANDOM(5)`,这样使得 TiDB 不会分配出大于 `9007199254740991` (2^53-1) 的整数。 `AUTO RANDOM` 列隐式分配的值会影响 `last_insert_id()`。可以使用 `SELECT last_insert_id()` 获取上一次 TiDB 隐式分配的 ID。