高并发【批量on duplicate key update】时:AUTO_RANDOM(5) 生成重复

可以看一下官网:https://docs.pingcap.com/zh/tidb/v7.3/auto-random
AUTO_RANDOM(5)。而 TiDB 很容易会为 AUTO_RANDOM(5) 的列分配超出该范围的整数,导致应用程序读取该列的值时出现异常。此时,你可以用 AUTO_RANDOM(5, 54) 代替 AUTO_RANDOM(5),使得 TiDB 不会分配出大于 9007199254740991 (2^53-1) 的整数。

注意

分片位长度 (S) 的选取:

  • 由于总位数固定为 64 位,分片位的数量会影响到自增位的数量:当分片位数增加时,自增位数会减少,反之亦然。因此,你需要权衡“自动分配值的随机性”以及“可用空间”。
  • 最佳实践是将分片位设置为 log(2, x),其中 x 为当前集群存储引擎的数量。例如,一个 TiDB 集群中存在 16 个 TiKV,分片位可以设置为 log(2, 16),即 4。在所有 Region 被均匀调度到各个 TiKV 上以后,此时大批量写入的负载可被均匀分布到不同 TiKV 节点,以实现资源最大化利用。

值域长度 (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) 的整数。