将联合主键替换成bigint方案设计

一、环境

RDS:MySQL

RDS-Proxy:ShardingSphereProxy

二、场景描述

在项目中有一些历史表,使用了联合主键,这里列举一部分联合主键的缺点:

  1. 跟业务耦合 一般使用联合主键,都是跟着业务走,比如使用org_code、biz_code这种模式,违背了数据库设计三大原则
  2. 非顺序 因为MySQL8采用InnoDB(MyISam过时),底层使用了B+树和聚集索引,当顺序写入时,叶分裂只会在尾部,影响范围较小,但当数据在中间插入,就会造成中间叶分裂,重平衡消耗很大
  3. 空间占用大 因为使用业务方提供的业务编码作为联合主键,通常长度设置得非常长,当联合主键占用空间大,意味着一次加载数据页占用就越大,在相同数据量时更快地向更深层的树发展

三、解决方案

场景:

  1. 不分片 新增id字段,并设置为主键,将联合主键更改为联合唯一索引
  2. 分片
    • 估计分片最大数据量
    • 以最大数据量为基点 + 未来最大数据量(无法估计默认为亿)
    • 数据库设置为自增
    • 设置自增起始值为数据分片前缀 + 最大数据量抹零(000000000) = 100_000000000
    • 去掉数据库自增

说明:此处是作为初始化主键方案,后续会使用snowflake算法来作为主键生成策略,本方案适用在此场景,不同场景需要自定义

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章