MySQL学习笔记之MySQL的自增主键为什么不连续(二十三)

本文详细介绍了MySQL中自增主键的工作原理,包括不同引擎的保存策略、自增值的修改机制、主键连续性的影响因素及自增锁策略。深入探讨了MyISAM与InnoDB引擎下自增值的存储位置,自增ID的生成与更新规则,以及事务回滚、批量申请ID对主键连续性的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:本文章内容是根据极客时间中林晓斌的课程《MYSQL45讲》,经过学习,加以自己的理解形成的笔记。具体原文可以到官网进行阅读。如有侵权请,告知删除。

1、自增主键

在MySQL当中AUTO_INCREMENT用来修饰的字段表示,改主键是是自增的。那么自增的主键保存在哪里。不同的引擎保存策略不相同。

  • MyISAM 引擎的自增值保存在数据文件中。
  • InnoDB 引擎的自增值,其实是保存在了内存里;在版本8.0之后才引入持久化;在8.0之前如果发生重启就会选择max+1 为当前的最大值
2、自增值的修改机制
  • 如果插入的是0,null 也就是未制定状态,那么AUTO_INCREMENT的值就为当前id;并且AUTO_INCREMENT为
    AUTO_INCREMENT+步长
  • 如果插入数据的时候制定了 id的值,那么id就取已经存在的值
    新的AUTO_INCREMENT的生成策略为( 假设:新ID 为X;AUTO_INCREMENT为Y)
  • X<Y AUTO_INCREMENT保持不变
  • X≥Y AUTO_INCREMENT=Y
3、什么情况下主键不是连续
  • 1.插入时发生冲突,报错的,自增值变更,是在真正执行插入数据的操作之前操作的,所以发送冲突之后,自增值并不会还原
  • 2.事务回滚,当插入的数据发生回滚时,插入数据时所增加的自增值并不会 还原
  • 3.批量申请id导致主键值不连续
insert into t values(null, 1,1);
insert into t values(null, 2,2);
insert into t values(null, 3,3);
insert into t values(null, 4,4);

对于批量插入数据的语句,MySQL 有一个批量申请自增 id 的策略:

  1. 语句执行过程中,第一次申请自增 id,会分配 1 个;
  2. 1 个用完以后,这个语句第二次申请自增 id,会分配 2 个;
  3. 2 个用完以后,还是这个语句,第三次申请自增 id,会分配 4 个;
    依此类推,同一个语句去申请自增 id,每次申请到的自增 id 个数都是上一次的两倍。那么这样就会造成最后一次申请的id不能使用完全。但是当下次申请的时候,并不会接着使用。
4、自增锁的策略

自增锁也就是对于 修改自增值的这个操作的锁,当要作自增值操作会获取锁,使用完成,释放后被的事务也就可以申请了,但是锁的释放时机有下面几种情况 并且通过innodb_autoinc_lock_mode 这个参数控制

  • 这个参数的值被设置为 0 时 语句执行结束之后释放锁
  • 这个参数的值被设置为 1 时:
    • 普通 insert 语句,自增锁在申请之后就马上释放;
    • 类似 insert … select 这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放
  • 设置为2 时 锁释放的时机是 申请之后就会释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值