【 TiDB 使用环境】生产环境
【 TiDB 版本】6.X版本
【遇到的问题:使用TIDB 集群的自增id,出现了热点数据,如何在不改变自增id的条件下,持久性解决热读写问题
【资源配置】
【附件:截图/日志/监控】
官网建议将将id自增改为AUTO_RANDOM。业务依赖这个自增id
1 个赞
你的自增主键是聚簇索引?
是聚簇索引
聚簇索引表,tidb_rowid就是你的表的主键。
主键自增肯定有写入热点。
改成非聚簇索引表,代价会很大吗?
另外这只会有写入热点,读取应该不会形成热点。
1 个赞
官方建议使用 AUTO_RANDOM 处理自增主键热点表,302课程也有相应的处理案例 为董非老板点赞
如果想保留自增主键,可以改成非聚簇表,并指定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 个赞