引言

MySQL中auto_increment字段估计大家都经常用到,特别是innodb引擎。我也经常用,只知道mysql可以保证这个字段在多进程操作时的原子性,具体原理又是什么,后来查阅了MySQL手册以及相关资料,了解了个大概。

本文只探究了mysql5.5中innodb引擎auto_increment的问题。

定义

使用auto_increment的字段可能生成唯一的标识。

如何使用

可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。

可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。

使用规范

AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。

设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。

AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复(即是主键或者主键的一部分)。

AUTO_INCREMENT数据列必须具备NOT NULL属性。

AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,

AUTO_INCREMENT就会失效。

当进行全表删除时,MySQL AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时: delete from table_name;

或者

truncate table table_name

原理(这里面是重点)

传统auto_increment原理

mysql innodb引擎的表中的auto_increment字段是通过在内存中维护一个auto-increment计数器,来实现该字段的赋值,注意自增字段必须是索引,而且是索引的第一列,不一定要是主键。例如我现在在我的数据库test中创建一个表t,语句如下: CREATE TABLE `t_test` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',

PRIMARY KEY (`id`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试表'

则字段a为auto_increment类型,在mysql服务器启动后,第一次插入数据到表t_test时,InnoDB引擎会执行等价于下面的语句: SELECT MAX(id) FROM t FOR UPDATE;

Innodb获取到当前表中id字段的最大值并将增加1(默认是增加1,如果要调整为增加其他数目,可以设置auto_increment_increment这个配置的设置)然后赋值给该列以及内存中该表对应的计数器

在传统的auto_increment设置中,每次访问auto-increment计数器的时候, INNODB都会加上一个名为AUTO-INC锁直到该语句结束(注意锁只持有到语句结束,不是事务结束).AUTO-INC锁是一个特殊的表级别的锁,用来提升包含auto_increment列的并发插入性能.因此,两个事务不能同时获取同一个表上面的AUTO-INC锁,如果持有AUTO-INC锁太长时间可能会影响到数据库性能(比如INSERT INTO t1... SELECT ... FROM t2这类语句).

改进后

基于上面传统方式的问题(性能太差),在mysql5.1开始,新增加了一个配置项innodb_autoinc_lock_mode来设定auto_increment方式.

可以设置的值为0,1,2.其中0就是第一节中描述的传统auto_increment机制,而1和2则是新增加的模式,默认该值为1,可以中mysql配置文件中修改该值.这里主要来看看这两种新的方式的差别;

在描述差别前需要先明确几个插入类型:

simple inserts

能够确定具体的插入行数的语句。

bulk inserts

事先无法确定插入行数的语句

mixed-mode inserts

有些行指定了auto_increment列的值有些没有指定

下面看看设置innodb_autoinc_lock_mode为不同值时的情况:

innodb_autoinc_lock_mode=0(traditional lock mode)

传统的auto_increment机制,这种模式下所有针对auto_increment列的插入操作都会加AUTO-INC锁,分配的值也是一个个分配,是连续的,正常情况下也不会有间隙(当然如果事务rollback了这个auto_increment值就会浪费掉,从而造成间隙)。

innodb_autoinc_lock_mode=1(consecutive lock mode)

这种情况下,针对bulk inserts才会采用AUTO-INC锁这种方式,而针对simple inserts,则采用了一种新的轻量级的互斥锁来分配auto_increment列的值。当然,如果其他事务已经持有了AUTO-INC锁,则simple inserts需要等待.

需要注意的是,在innodb_autoinc_lock_mode=1时,语句之间是可能出现auto_increment值的间隔的。比如mixed-mode inserts以及bulk inserts中都有可能导致一些分配的auto_increment值被浪费掉从而导致间隙。后面会有例子。

innodb_autoinc_lock_mode=2(interleaved lock mode) 这种模式下任何类型的inserts都不会采用AUTO-INC锁,性能最好,但是在同一条语句内部产生auto_increment值间隙。此外,这种模式对statement-based replication也不安全。

mysql auto_increment 原理_mysql原理之Auto_increment相关推荐

  1. mysql mdl 锁_mysql原理 ~ 细说 MDL锁

    一 简介: MDL锁 二 分类 1 MDL读锁 MDL读锁是相互兼容的 SHARED_READ 2 MDL 写锁 MDL写锁是互斥的 EXCLUSIVE 三 针对目标 1 目标 MDL锁是针对语句级别 ...

  2. mysql权限系统的工作原理_Mysql权限系统工作原理

    MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来授予权限. MyS ...

  3. mysql 字符串 底层_Mysql 的索引底层原理及数据结构详解

    Mysql 的索引底层原理 1.什么是索引? 索引是一种排好序的数据结构,mysql目前默认使用的是b+树. 2.为什么使用b+树? 例如表table 数据 id name 1 zs 2 ls 3 s ...

  4. mysql的备份恢复原理_MySQL备份恢复-mysqldump原理

    +++++++++++++++++++++++++++++++++++++++++++ 标题:mysqldump对MySQL数据库备份恢复原理 时间:2019年2月23日 内容:mysqldump工具 ...

  5. mysql+join的原理,Mysql连接join查询原理知识点

    Mysql连接join查询原理知识点 Mysql连接(join)查询 1.基本概念 将两个表的每一行,以"两两横向对接"的方式,所得到的所有行的结果. 假设: 表A有n1行,m1列 ...

  6. 五、Mysql事务以及锁原理

    五.Mysql事务以及锁原理 事务(ACID) 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种 ...

  7. 为了把mysql的索引底层原理讲清楚,我把计算机翻了个底朝天

    来自:非科班的科班 什么是索引 概念:索引是提高mysql查询效率的数据结构.总的一句话概括就是索引是一种数据结构. 数据库查询是数据库的最主要功能之一.设计者们都希望查询数据的速度能尽可能的快,因此 ...

  8. MySQL事务ACID实现原理

    照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity).一致性(Consistency).隔离性(Isolati ...

  9. MySQL的MVCC底层原理二

    承接上文MySQL的MVCC底层原理 上文说到时序图中的第12步这篇文章咱接着聊完 时序图 图1 时序图第12步中的查询事务的read-view情况 图2 read-view为[100,200],30 ...

最新文章

  1. 2017java最新面试题_2017年最新java面试题及答案
  2. 使用 MarkDown DocFX 升级 Rafy 帮助文档
  3. vr降噪器英文是什么_什么是VR体验馆设备?
  4. arduino pmw 串口 字符串_ESP32 Arduino开发:串口(Serial port)
  5. 第二十三讲:访问者模式
  6. 超融合硬件损坏导致Oracle RAC异常恢复实录
  7. 利用 html 和 css 实现导航栏下拉(display block、display none)
  8. 推荐一款 ES 集群可视化工具:Cerebro,简单、实用!
  9. 利用老毛桃启动盘制作三合一系统启动:WINPE + CDlinux + Ubuntu
  10. bs4 乱码_python使用beautifulsoup乱码问题
  11. 在线格式化mysql_SQL在线美化 | SQL格式化 | SQL压缩 —在线工具
  12. Java毕业设计-医院药品管理系统
  13. 多元统计分析-联合分析
  14. CUDA 下载不了(只有 42B)的应急解决办法(暂时可用)
  15. 如何解决移动端 Retina 屏 1px 像素问题 ?
  16. nn.Sigmoid torch
  17. 怎样在 Linux 命令行中切换用户
  18. mac与windows的区别
  19. MODIS下载、处理全流程记录
  20. 【哲学】笛卡尔天赋观念论理解

热门文章

  1. 怎么把音乐中的伴奏提取出来?这几个方法值得尝试一番
  2. PaddlePaddle第二周学习笔记
  3. 膨胀卷积的缺点_卷积、反卷积与膨胀卷积
  4. 小程序中的页面导航(页面跳转)
  5. 怎么将.txt改为任意文件格式
  6. java 获取 yyyymmdd_从JS日期对象获取YYYYMMDD格式的字符串?
  7. Ubuntu16.04如何调整屏幕分辨率至1920*1080
  8. Ubuntu修改系统时间到北京时间的步骤
  9. iphone输入法换行_iphone打字怎么换行?iphone输入法换行教程
  10. Crontab定时执行任务