MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增
在MySQL5.7中做INSERT IGNORE时发现, 即使INSERT未成功执行, 表的自增主键却自动加1了, 在某些情况下需要避免这种行为. 需要修改的变量是 innodb_autoinc_lock_mode, 将其设为0后, 在INSERT未成功执行时不会自增主键.
innodb_autoinc_lock_mode在MySQL各版本的默认值
根据MySQL官方手册的说明:
There are three possible settings for the innodb_autoinc_lock_mode configuration parameter. The settings are 0, 1, or 2, for “traditional”, “consecutive”, or “interleaved” lock mode, respectively. As of MySQL 8.0, interleaved lock mode (innodb_autoinc_lock_mode=2) is the default setting. Prior to MySQL 8.0, consecutive lock mode is the default (innodb_autoinc_lock_mode=1).
在MySQL8中, 默认值为 2 (interleaved, 交错), 在MySQL8以前, 准确地说在8之前, 5.1之后, 默认值为 1 (consecutive, 连续), 在更早的版本是 0
innodb_autoinc_lock_mode的说明
这个值主要用于平衡性能与安全(主从的数据一致性), insert主要有以下类型
- simple insert 如insert into t(name) values('test')
- bulk insert 如load data | insert into ... select .... from ....
- mixed insert 如insert into t(id,name) values(1,'a'),(null,'b'),(5,'c');
innodb_autoinc_lock_mode = 0:
- 与更高版本的MySQL向后兼容
- 在这一模式下,所有的insert语句都要在语句开始的时候得到一个表级的auto_inc锁,在语句结束的时候才释放这把锁,一个事务可能包涵有一个或多个语句
- 它能保证值分配的可预见性,与连续性,可重复性,这个也就保证了insert语句在复制到slave的时候还能生成和master那边一样的值(它保证了基于语句复制的安全)
- 由于在这种模式下auto_inc锁一直要保持到语句的结束,所以这个就影响到了并发的插入
innodb_autoinc_lock_mode = 1:
- 这一模式对simple insert做了优化,由于simple insert一次性插入值的个数可以立即确定, 所以mysql可以一次生成几个连续的值用于这个insert语句, 总的来说这个对复制也是安全的(保证了基于语句复制的安全)
- 这一模式也是MySQL8.0之前的默认模式, 这个模式的好处是auto_inc锁不要一直保持到语句的结束, 只要语句得到了相应的值后就可以提前释放锁
innodb_autoinc_lock_mode = 2:
- 由于这个模式下已经没有了auto_inc锁, 所以这个模式下的性能是最好的, 但是它也有一个问题, 就是对于同一个语句来说它所得到的auto_incremant值可能不是连续的
- 现在mysql已经推荐把二进制的格式设置成row, 所以在binlog_format不是statement的情况下这个模式可以达到最好的性能
相关文章
- IOT产品解读及最佳实践|阿里云产品内容精选(十五)
- 大数据显示:上海女人最难脱单?看到原因我哭了
- 京东:Flink SQL 优化实战
- RDS MySQL数据库部分问题解析|阿里云产品内容精选(十四)
- golang 系列:深入认识 map!
- 不少电脑被迫使用Windows 10:因配置低无缘Windows 11 想升升不了
- OpenHarmony性能分析工具Bytrace
- 苹果 macOS 12.2 RC 发布,修复 Safari 浏览器泄露隐私漏洞
- 如何根据 Macie 检测结果为 S3 自动打上自定义敏感数据标签?
- Oracle On EC2 多租户架构轻松、高效整合数据库上云
- java--Java数组
- 利用 Lambda 将 Kinesis Data Stream 数据批量自动写入 MSK
- 新增功能 – AWS CloudTrail Lake 支持从非 AWS 来源摄取活动事件
- 基于 Redshift 和 Grafana 搭建实时大屏应用
- 使用 Lettuce 和 Redisson 对 Amazon Multi-AZ ElastiCache for Redis 实现就近读取
- 【java】java String 源码
- 【Python】------- Python 列表 list方法
- 使用 Kafka Connect 简化数据采集管道
- Amazon EMR HBase on S3 之二级索引、Thrift 和性能评测
- 使用 Amazon DocumentDB 和 Amazon MSK 通过 Kafka 连接器流式传输数据