不同引擎主键自增值的保存
- MyISAM引擎的自增值保存在数据文件中。
- InnoDB,MySQL5.7及以前的版本,保存在内存里(没有持久化,MySQL重启后不会记录之前的值,而是找当前最大的id值+1);MySQL8.0版本后,保存在redo log中,有恢复能力。
字段定义为AUTO_INCREMENT的行为
- 如果插入的数据字段为0,null或未指定值,那么就把这个表当前的AUTO_INCREMENT值填到自增字段。
- 如果插入数据时指定了字段具体的值,就直接使用指定的值。
1、如果要插入的值<当前的自增值,那么这个表的自增值(AUTO_INCREMENT)不变。
2、如果要插入的值>=当前自增值,把当前的自增值修改为新的自增值。
新的自增值生成算法
- 从
auto_increament_offset
开始,以auto_increment_increment
为步长,持续叠加,直到找到第一个大于要插入值的值,作为新的自增值。 -
auto_increment_offset
表示初始值,auto_increment_increment
表示步长,默认值都是1。 - 在初始值和步长都是1的情况下,新的自增值生成逻辑:
1、要插入的值>=当前的自增值,新的自增值就是要插入的值+1。
2、否则,自增值不变。 - 某些场景下初始值和步长不全是默认配置。比如双M的主备结构要求双写的时候,就可能将步长设置为2,让一个库的自增id是奇数,另一个库的自增id是偶数,避免两个库生成的主键发生冲突。
可能导致自增值不连续的原因
- 数据插入操作出现Duplicate key error后。
- 事务回滚后。
网友评论