保证MySQL主键的自增长及其意义—微服务之间同步一条记录的id
2019-12-26 本文已影响0人
猫尾草
1. 几个基本知识
- MySQL每个表必须有一个主键,主键具有唯一性,采用MySQL主键自生成策略还是采用其他方式在这一点上问题不大;
- 主键是包含索引的,然后mysql的索引是通过b+树来实现的,每一次新的数据的插入,为了查询的优化,InnoDB引擎都会对主键重排序,即对索引底层的b+树进行修改;如果主键不是像MySQL自增主键那样本身就是从小到大有序增长,那么b+树频繁大调整,InnoDB会产生巨大的IO压力。
2. 应用场景
问题:
当两个模块A、B,A中的表a的记录和B中的表b的记录有关联关系时,有两种选择,一是表a直接使用表b的记录的id,假如B是单应用,没什么问题;假如B是一个集群,有两个问题,需要采取某种方式保证表a的id的唯一性,需要保证表a的id的自增性。第一个问题,唯一性,大家都明白;第二个问题,自增性,就是1中提到的InnoDB索引问题。
如果表a和b都是数据量很小的表,不经常修改数据,问题不大。如果表a频繁的新增删除数据,同时数据量很大或者采用逻辑删除,那么这时无序的id就会造成1中说的索引问题。
解决办法:
遇到过两次这个需求,都是表a用自己的自增id,添加一个字段,记录表b的id。