自增主键写入热点,要不要换 AUTO_RANDOM?

三节点 TiKV 集群,夜间批量写入,主键是 AUTO_INCREMENT。监控里一个 TiKV CPU 打满,另外两个很闲,热点集中在一个 region。手动 split 之后热点很快又回来。文档说可以换 AUTO_RANDOM,但业务代码依赖 last_insert_id,改动不小。想请教有没有人在生产上做过这个迁移?或者 pre-split 加 SHARD_ROW_ID_BITS 这条路是不是更稳妥?

你这个问题本质是 AUTO_INCREMENT 在 TiKV 上是单调递增的,写入总是落在最后一个 region,split 只能治标——新 region 很快又变成热点,因为写入模式没变。SHARD_ROW_ID_BITS 只对隐式 _tidb_rowid 生效,你已经有显式整型主键了,它不顶用。

AUTO_RANDOM 才是从根上打散:它把高位随机化,写入均匀分布到多个 region。

1 个赞

定位很准,这就是典型的单调递增写热点:split 后热点回来是必然的,自增 ID 一直往右写,pre-split 只是延后问题。另外 SHARD_ROW_ID_BITS 走不通:整型主键是聚簇索引,行键就是主键本身,除非把主键降成二级索引,否则它不生效。AUTO_RANDOM 倒是有好消息,LAST_INSERT_ID() 对它生效,getGeneratedKeys 也能拿到,要排查的是依赖 ID 连续/有序的逻辑和显式插主键的语句。它只能建表时指定,建的时候记得 PRE SPLIT REGIONS,双写灰度再切流。