一、环境
RDS:MySQL
RDS-Proxy:ShardingSphereProxy
二、场景描述
在项目中有一些历史表,使用了联合主键,这里列举一部分联合主键的缺点:
- 跟业务耦合 一般使用联合主键,都是跟着业务走,比如使用org_code、biz_code这种模式,违背了数据库设计三大原则
- 非顺序 因为MySQL8采用InnoDB(MyISam过时),底层使用了B+树和聚集索引,当顺序写入时,叶分裂只会在尾部,影响范围较小,但当数据在中间插入,就会造成中间叶分裂,重平衡消耗很大
- 空间占用大 因为使用业务方提供的业务编码作为联合主键,通常长度设置得非常长,当联合主键占用空间大,意味着一次加载数据页占用就越大,在相同数据量时更快地向更深层的树发展
三、解决方案
场景:
- 不分片 新增id字段,并设置为主键,将联合主键更改为联合唯一索引
- 分片
- 估计分片最大数据量
- 以最大数据量为基点 + 未来最大数据量(无法估计默认为亿)
- 数据库设置为自增
- 设置自增起始值为数据分片前缀 + 最大数据量抹零(000000000) = 100_000000000
- 去掉数据库自增
说明:此处是作为初始化主键方案,后续会使用snowflake算法来作为主键生成策略,本方案适用在此场景,不同场景需要自定义