自增主键带来的热点

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.X版本
【遇到的问题:使用TIDB 集群的自增id,出现了热点数据,如何在不改变自增id的条件下,持久性解决热读写问题
【资源配置】
【附件:截图/日志/监控】

官方文档给了解决方案 你可以看看
https://docs.pingcap.com/zh/tidb/stable/troubleshoot-hot-spot-issues#tidb-热点问题处理

官网建议将将id自增改为AUTO_RANDOM。业务依赖这个自增id

文档里推荐2个方案,一个是id自增改为AUTO_RANDOM,另一个是 通过设置 SHARD_ROW_ID_BITS ,可以把 RowID 打散写入多个不同的 Region,缓解写入热点问题。

1 个赞


不满足需求
表是有自增主键id

你的自增主键是聚簇索引?

是聚簇索引

聚簇索引表,tidb_rowid就是你的表的主键。
主键自增肯定有写入热点。

改成非聚簇索引表,代价会很大吗?

另外这只会有写入热点,读取应该不会形成热点。

1 个赞

官方建议使用 AUTO_RANDOM 处理自增主键热点表,302课程也有相应的处理案例 :smile: 为董非老板点赞

如果想保留自增主键,可以改成非聚簇表,并指定SHARD_ROW_ID_BITS打散数据,比如:
CREATE TABLE t2_nonclustered_autoinc (
id bigint(20) NOT NULL PRIMARY KEY NONCLUSTERED AUTO_INCREMENT,
id2 bigint(20) DEFAULT NULL,
name char(255) DEFAULT NULL,
varname char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin SHARD_ROW_ID_BITS = 4 PRE_SPLIT_REGIONS=3;

1 个赞

使用分段自增 ID

聚簇索引没办法直接改非聚簇索引,得新建表来迁移,操作成本很高的。如果业务没有根据id键来扫描的查询,最简单还是改成AUTO_RANDOM,是可以直接改的。

主要是改动有理论提升解决一些热点问题,实际效果可能一般

预先把表分成多个region

SPLIT TABLE TEST_HOTSPOT BETWEEN (0) AND (9223372036854775807) REGIONS 128;

非聚簇索 写入数据以外还有一次额外索引写入io

1 个赞