tidb 主键序列如何选择,是用AUTO_INCREMENT 还是用AUTO_RANDOM ,业务对主键要求很高,要连续的且会经常预置业务配置信息,请问对tikv 的分布是否会产生很大影响

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
请问下各位大佬,在设计开发时候,数据库设计主键时候什么情况下需要用AUTO_RANDOM,最长是多少?还有如果全部用 AUTO_INCREMENT 是否隐藏一些风险,因为没有表都有主键,主键全部是这种模式~谢谢~

如果需要连续的话 auto_increment 需要设置 AUTO_ID_CACHE = 1,参考 https://docs.pingcap.com/zh/tidb/stable/auto-increment#mysql-兼容模式 这个

在这个情况下需要打散的话,可以把主键设置为 non clustered index,再加上 SHARD_ROW_ID_BITS,参考 https://docs.pingcap.com/zh/tidb/stable/shard-row-id-bits

1 个赞

AUTO_INCREMENT也没啥问题,主要要求单调递增用AUTO_ID_CACHE=1,这个是否靠谱得测测你们用的版本

业务上有连续性要求,那就只有一个选项AUTO_INCREMENT

小表,没啥并发写入的配置表,就用 AUTO_INCREMENT 就好了
大表,写入量大的表,建议还是用 AUTO_RANDOM ,用来缓解热点,范围还是 bigint 的范围,只是高位会随机,所以生成的 id 也不是连续的,隐藏风险是万一哪天还要迁回 Mysql,数比较大不好看,bigint 少几位应该也不会用完,另外 AUTO_RANDOM 不建议显示写入

版本是:6.5.10

是的,业务和开发需要这么设置

嗯嗯,谢谢大佬~我是有要求,如果大量并发性读写类似流水类操作日志记录的,可以采用随机主键~其他,其实数据量小没有要求~

ID是业务字段时最好是auto_random
其次之前老版本auto_increment有重复问题所以用了auto_random,现在版本这个问题都已经解决了

现在版本指的是哪个版本?6.5.10 吗?

tidb分两种表,聚簇索引表和非聚簇索引表,主要看你主键索引是不是聚簇索引,而从5.0开始都由这个参数控制 tidb_enable_clustered_index(默认开启),如果你是开启的情况下,你创建带主键的表,你的表默认就是聚簇索引表了,而聚簇表的key值生成规则是他的key(RowID)都是tablePrefix{ TablelD }_recordPrefixSep{ Col1 },也就是你的key值高度依赖你的主键,如果你的主键是是int型且是auto_increment的,很容易产生写热点,如果换成auto_random,就不太容易产生。
如果你是小表,写入少,需要主键连续,那可以设置auto_increment并且auto_id_cache=1,这样可以符合业务要求,如果是大表,写入多,还需要主键连续的话,只能选择把表改成非聚簇索引表,非聚簇表的话,他的key都是tablePrefix { TablelD }_recordPrefixSep{ _Tidb_RowlD },就是key都是由_Tidb_RowlD(只有非聚簇表才会自动生成)这个拼接出来的,
由于_Tidb_RowlD自动生成也是自增int型,默认都会产生写热点,可以使用SHARD_ROW_ID_BITS相关参数来进行打散,从而缓解写热点问题。或者放弃主键连续,使用auto_random。
但是非聚簇索引表的效率会比聚簇索引表的效率稍微差一点,因为他的key不是主键生成的了,主键查询需要增加一次索引扫描。
auto_random一共位数最长64位,最大长度取决于你分片位的大小,假如你设置分片位为5,那你的最大数能是2的64-5-1=58次方,大概是288230376151711744。

1 个赞

@AN_12
老版本auto_increment有重复问题,这个是哪个版本的问题呢?
是否是因为显式插入与隐式插入混用导致的呢?如果不是,能分享一下出现重复问题的场景吗?

要求连续,那就只能AUTO_INCREMENT。风险最多就是读写热点

连续得auto_increment和cache=1配合用,也是有风险的

大数据量写热点,适合auto_random

我认为在业务层直接用雪花算法就好,不去绑定数据库特性

建议不使用这个

要求连续了,只能用AUTO_INCREMENT了