MySQL的innodb格式表批量插入数据时,自增主键不连续原因和解决办法

news/2024/12/2 12:34:13/

问题说明

mysql中造测试数据时,出现了主键不连续的情况

CREATE TABLE test  ( id int NOT NULL AUTO_INCREMENT COMMENT 'ID', name varchar(255) , PRIMARY KEY (id) 
);insert into test (name) VALUES ('A');insert into test (name) select name from test; 
insert into test (name) select name from test; 
insert into test (name) select name from test; 
insert into test (name) select name from test;select * from test;

结果:

`1  A`
`2  A`
`3  A`
`4  A`
`6  A`
`7  A`
`8  A`
`9  A`
`13 A`
`14 A`
`15 A`
`16 A`
`17 A`
`18 A`
`19 A`
`20 A`

5,10,11,12 丢失了

原因分析

经查询发现是innodb存储引擎有三种自增模式

innodb_autoinc_lock_mode 变量有三种可能的设置:0、1 或 2,分别对应“传统”(traditional)、“连续”(consecutive)和“交错”(interleaved)锁模式。在 MySQL 8.4 中,默认设置为交错锁模式(innodb_autoinc_lock_mode=2)。

SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode';
Variable_nameValue
innodb_autoinc_lock_mode2

交错锁模式是默认设置。

  • innodb_autoinc_lock_mode = 0(“传统”锁模式)

传统锁模式提供了与 innodb_autoinc_lock_mode 变量引入之前相同的行为。传统锁模式是为了向后兼容、性能测试以及解决“混合模式插入”问题(由于语义上的差异)而提供的。在这个锁模式下,所有“插入类”语句会获取一个特殊的表级 AUTO-INC 锁,这个锁通常会保持到语句执行结束(而不是事务结束),以确保自动增长值在一系列插入语句中按照可预测且可重复的顺序分配,并且保证同一语句分配的自动增长值是连续的。

  • innodb_autoinc_lock_mode = 1(“连续”锁模式)

在此模式下,“批量插入”语句使用特殊的 AUTO-INC 表级锁,并保持该锁直到语句结束。这适用于所有的 INSERT … SELECT、REPLACE … SELECT 和 LOAD DATA 语句。在一个时间点,只能有一个语句持有 AUTO-INC 锁并执行。如果批量插入操作的源表和目标表不同,目标表上的 AUTO-INC 锁会在对源表的第一行加共享锁后获取。如果源表和目标表相同,AUTO-INC 锁会在对所有选定行加共享锁后获取。此锁模式确保,即使执行了插入语句,其中的自动增长值也是连续的,并且对于基于语句的复制是安全的。

  • innodb_autoinc_lock_mode = 2(“交错”锁模式)

在此模式下,没有“插入类”语句使用表级的 AUTO-INC 锁,允许多个语句同时执行。这是最快且最具扩展性的锁模式,但在此模式下,自动增长值保证在所有并发执行的“插入类”语句中唯一且单调递增。然而,由于多个语句可以同时生成自动增长值(即,分配过程交错进行),因此某个语句生成的插入行的值可能不是连续的。

解决办法

主键的不连续通常不影响业务,切换到连续模式在并发场景性能相对较差
切换方法,在配置文件如my.inimy.cnf中增加一行

innodb_autoinc_lock_mode=0

参考

[1] http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference
[2] https://dev.mysql.com/doc/refman/8.4/en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-modes
[3] https://stackoverflow.com/questions/14641847/how-to-change-innodb-autoinc-lock-mode-to-be-set-to-0-from-1


http://www.ppmy.cn/news/1551751.html

相关文章

vue3+vite使用vite-plugin-electron-renderer插件和script-loader插件有冲突

报错信息:Error: Dynamic require of "path" is not supported 报错问题是在使用vite-plugin-electron-renderer插件不支持import动态引入,该报错信息并不准确,实际原因是vite-plugin-electron-renderer插件和script-loader插件有…

反向传播、梯度下降与学习率:深度学习中的优化艺术

目录 反向传播:神经网络的学习机制 梯度下降:优化算法的基石 学习率:平衡速度与稳定性的关键 学习率的调整策略 固定学习率 学习率衰减 自适应学习率 梯度消失与梯度爆炸 结语 在深度学习的领域中,构建一个有效的神经网络…

从0开始学PHP面向对象内容之常用设计模式(策略,观察者)

PHP设计模式——行为型模式 PHP 设计模式中的行为模式(Behavioral Patterns)主要关注对象之间的通信和交互。行为模式的目的是在不暴露对象之间的具体通信细节的情况下,定义对象的行为和职责。它们常用于解决对象如何协调工作的问题&#xff…

python array矩阵相关操作

目录: 一、判断某个值是否在array二维数组的某列中 二、根据某列中的特定值筛选array数组 三、查找一个元素在二维 array 矩阵中的位置 四、判断array数组中的每个元素是否包含特定的子字符串 一、判断某个值是否在array二维数组的某列中 在 Python 中&#xf…

从 HTML 到 CSS:开启网页样式之旅(五)—— CSS盒子模型

从 HTML 到 CSS:开启网页样式之旅(五)—— CSS盒子模型 前言一、盒子模型的组成margin(外边距):border(边框):padding(内边距):conten…

Rook入门:打造云原生Ceph存储的全面学习路径(下)

文章目录 六.Rook部署云原生CephFS文件系统6.1 部署cephfs storageclass6.2 创建容器所需cephfs文件系统6.3创建容器pod使用rook-cephfs提供pvc6.4 查看pod是否使用rook-cephfs 七.Ceph Dashboard界面7.1 启用dashboard开关7.2 ceph-dashboard配置外部访问7.3 Dashboard web ad…

美畅物联丨如何通过ffmpeg排查视频问题

在我们日常使用畅联AIoT开放云平台的过程中,摄像机视频无法播放是较为常见的故障。尤其是当碰到摄像机视频不能正常播放的状况时,哪怕重启摄像机,也仍然无法使其恢复正常的工作状态,这着实让人感到头疼。这个时候,可以…

Oracle 19c RAC单节点停机维护硬件

背景 RAC 环境下一台主机硬件光纤卡不定时重启,造成链路会间断几秒,期间数据库会话响应时间随之变长,该光纤卡在硬件厂商的建议下,决定停机更换备件,为保证生产影响最小,决定停掉该节点,另外节…