其他
面试官:MySQL 自增主键一定是连续的吗?
耗时8个月联合打造 《 2023年Java高薪课程 》,已更新了 102G 视频,累计更新时长 500+ 个小时,需要的小伙伴可以了解下,一次购买,持续更新,无需2次付费。
1
测试环境2
自增值的属性特征MySQL5.7版本
MySQL8.0之后版本
如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT 值填到自增字段; 如果插入数据时 id 字段指定了具体的值,就直接使用语句里指定的值。
如果 X<Y,那么这个表的自增值不变; 如果 X≥Y,就需要把当前自增值修改为新的自增值。
3
新增语句自增主键是如何变化的insert into t values(null, 1, 1);
AUTO_INCREMENT=1 (表示下一次插入数据时,如果需要自动生成自增值,会生成 id=1。) insert into t values(null, 1, 1) (执行器调用 InnoDB 引擎接口写入一行,传入的这一行的值是 (0,1,1)) get AUTO_INCREMENT=1 (InnoDB 发现用户没有指定自增 id 的值,获取表 t 当前的自增值 1 ) AUTO_INCREMENT=2 insert into t values(1, 1, 1) (将传入的行的值改成 (1,1,1),并把自增值改为2) insert (1,1,1) 执行插入操作,至此流程结束
4
自增主键值不连续情况:(唯一主键冲突)insert into t values(null, 1, 1);
AUTO_INCREMENT=2 (表示下一次插入数据时,如果需要自动生成自增值,会生成 id=2。) insert into t values(null, 1, 1) (执行器调用 InnoDB 引擎接口写入一行,传入的这一行的值是 (0,1,1)) get AUTO_INCREMENT=2 (InnoDB 发现用户没有指定自增 id 的值,获取表 t 当前的自增值 2 ) AUTO_INCREMENT=3 insert into t values(2, 1, 1) (将传入的行的值改成 (2,1,1),并把自增值改为3) insert (2,1,1) 执行插入操作,由于已经存在 c=1 的记录,所以报 Duplicate key error,语句返回。
5
自增主键值不连续情况:(事务回滚)6
自增主键值不连续情况:(批量插入)语句执行过程中,第一次申请自增 id,会分配 1 个; 1 个用完以后,这个语句第二次申请自增 id,会分配 2 个; 2 个用完以后,还是这个语句, 第三次申请自增 id,会分配 4 个; 依此类推,同一个语句去申请自增 id,每次申请到的自增 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);
create table tt like t;
insert into tt(c,d) select c,d from t;
insert into tt values(null, 5,5);
7
自增主键值的优化传统模式(Traditional)
间断模式(Consecutive)
穿插模式(Interleaved)
8
MySQL8.0做了哪些优化
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
往期推荐
HTTPS 终于搞懂了 !
丝滑的打包部署,一套带走!
SpringBoot一行代码实现文件上传20个平台!少写代码到极致!
针对 jar 和 vue 的一键自动化部署工具,界面友好,操作简单(已开源)