MySQL主键

不同引擎主键自增值的保存

  • 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后。
  • 事务回滚后。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容