Skip to content

Commit

Permalink
update auto-random.md (#17908)
Browse files Browse the repository at this point in the history
  • Loading branch information
tangenta authored Jul 12, 2024
1 parent 695ba87 commit c9a0ad3
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions auto-random.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]`

> **注意:**
>
Expand All @@ -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。

Expand Down

0 comments on commit c9a0ad3

Please sign in to comment.