MySQL中InnoDB 表的 自增(AUTO_INCREMENT )列详解

2024-01-28 18:28

本文主要是介绍MySQL中InnoDB 表的 自增(AUTO_INCREMENT )列详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

innodb表必须将 AUTO_INCREMENT 列定义为某个索引的第一个或唯一列。建议将 AUTO_INCREMENT 列设置为 PRIMARY KEY(主键)或 UNIQUE(唯一键)索引的一部分,以防止出现重复值

InnoDB AUTO_INCREMENT 锁模式

InnoDB 使用不同的锁模式来生成自增值:

innodb_autoinc_lock_mode =0traditional
  • 在这种模式下,InnoDB使用类似于MyISAM存储引擎的锁定策略。
  • 对于包含自增列的每个INSERT语句,InnoDB会对表加上排他锁(auto-inc锁),直到当前语句完成才释放。
  • 这是最安全的模式,因为它可以保证在任何情况下都不会生成重复的自增值。
  • 但由于需要持续地获取和释放锁,所以可能会导致性能问题,特别是在高并发的插入操作时。
innodb_autoinc_lock_mode =1consecutive
  • 这种模式针对单个INSERT操作仍然使用锁,但如果是批量插入(比如INSERT ... SELECT或者LOAD DATA INFILE),则采用不同的策略,只在批量插入开始时获取一次锁,然后计算出所有行所需的自增值范围,接着释放锁。
  • 这种模式可以减少锁的竞争,提高并发插入的性能,同时依旧保证不会产生重复的自增值。
  • 是MySQL 5.1版本以后的默认设置。
innodb_autoinc_lock_mode =2interleaved
  • 在这种模式下,InnoDB不会对自增列使用表级锁。
  • 自增值的分配是在每行插入的时候动态进行的,而不是预先计算出一个范围。
  • 这种模式允许高度并发的插入操作,因为不同的事务可以同时插入数据而不会等待其他事务释放自增锁。
  • 但在某些场合,比如复制环境或者某些类型的备份操作中,可能会产生间隔的自增值,因此它适用于那些对自增值连续性没有要求的场景。
  • 需要注意的是,在这种模式下,如果发生回滚,已经分配的自增值将不会被回收,可能会存在自增值的跳跃。
  • 是MySQL 8.0版本以后的默认设置。

MySQL 8.0 默认使用交错锁模式(2),反映了从基于语句的复制默认更改为基于行的复制。

AUTO_INCREMENT 计数器初始化
  • MySQL 5.7 及更早版本在内存中存储自增计数器;服务器重启后,使用 SELECT MAX(ai_col) FROM table_name FOR UPDATE 初始化。
  • MySQL 8.0 中,自增计数器值写入重做日志并在每次检查点保存到数据字典,使得值在服务器重启后持久。
  • 在正常关闭后的服务器重启,或者在崩溃恢复过程中,InnoDB 使用数据字典中的当前最大自增值初始化内存中的计数器。
  • 如果没有 .cfg 元数据文件导入表,则还是会使用 SELECT MAX(ai_col) 来初始化计数器值。

注意

  • 修改 AUTO_INCREMENT 列的值或设置 ALTER TABLE ... AUTO_INCREMENT = N 只能将自增计数器值更改为当前最大值以上的值。
AUTO_INCREMENT 锁模式使用影响
  • 基于语句的复制时,应将 innodb_autoinc_lock_mode 设置为 0 或 1,并在源服务器和副本上使用相同的值。
  • 在基于行或混合格式复制中,所有自增锁模式都是安全的。

其他注意事项

  • 在任何锁模式下,回滚事务生成的自增值都将“丢失”,且不会被重用。
  • 在所有锁模式下,如果用户为 AUTO_INCREMENT 列指定 NULL 或 0,InnoDB 将为其生成新值。
  • 如果 AUTO_INCREMENT 值超过指定整数类型的最大值,自增机制的行为是未定义的。
  • 对于“混合模式插入”,不同的锁模式有不同的结果,如上所述的例子所示。
设置自增列的相关变量
  • auto_increment_offset 决定 AUTO_INCREMENT 列值的起始点,默认为 1。
  • auto_increment_increment 控制连续列值之间的间隔,默认为 1。

这篇关于MySQL中InnoDB 表的 自增(AUTO_INCREMENT )列详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654428

相关文章

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Python3.6连接MySQL的详细步骤

《Python3.6连接MySQL的详细步骤》在现代Web开发和数据处理中,Python与数据库的交互是必不可少的一部分,MySQL作为最流行的开源关系型数据库管理系统之一,与Python的结合可以实... 目录环境准备安装python 3.6安装mysql安装pymysql库连接到MySQL建立连接执行S

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交