InnoDB自增长主键与锁

虚树涟漪
• 阅读 779

在InnoDB内存结构中,对每个含有自增长的表都有一个自增长计数器,当进行插入操作时,这个计数器会被初始化,执行如下语句得到计数器的值:

select max(auto_inc_col) from t for update

插入操作会依据这个自增长计数器值加1赋给自增长列,这个实现方式叫AUTO-INC Locking。此锁是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL语句后立即释放。但对于类似insert...select的插入则需要等待另一个事务结束,这样性能就下降了。
在版本mysql.5.1.22开始,InnDB提供了一种经量级互斥量的自增长实现机制以提高自增长值的插入性能,innodb_autoinc_lock_mode参数可以配置使用锁还是互斥量。

理论上mysql主键会用完,如果是int类型其最大值为4294967295;bigint则为18446744073709551615,这两个数据已经很大了,不过不太可能会增长到那个时候,因为早就要进行分库分表了。

本文来自于《mysql技术内幕 InnoDB存储引擎》一书

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL使用on duplicate key update时导致主键不连续自增
使用onduplicatekeyupdate语法有时是很方便,但是会有一个影响:默认情况下,每次更新都会更新该表的自增主键ID,如果更新频率很快,会导致主键ID自增的很快,过段时间就超过数字类型的的范围了解决这个问题,有两种方式:(实际我目前使用的方式是把自增主键ID设置为bigint,也有一部分操作先查询再选择插入OR更新)方法一:拆分成两个
Wesley13 Wesley13
3年前
MySQL在INSERT IGNORE未新增记录时避免AUTO_INCREMENT自增
在MySQL5.7中做INSERTIGNORE时发现,即使INSERT未成功执行,表的自增主键却自动加1了,在某些情况下需要避免这种行为.需要修改的变量是 innodb\_autoinc\_lock\_mode,将其设为0后,在INSERT未成功执行时不会自增主键.innodb\_autoinc\_lock\_mode在MySQL各版本
Stella981 Stella981
3年前
ReenTrantLock可重入锁和synchronized的区别
ReenTrantLock可重入锁和synchronized的区别可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。锁的实现:S
Wesley13 Wesley13
3年前
CIL锁,GIL与线程池的区别,进程池和线程池,同步与异步
一.GIL锁什么是GIL?全局解释器锁,是加在解释器上的互斥锁GC是python自带的内存管理机制,GC的工作原理:python中的内存管理使用的是应用计数,每个数会被加上一个整型的计数器,表示这个数据被引用的次数,当这个整数变为0时则表示该数据已经没有人使用,成为了垃圾数据,当内存占用达到某个阈值,GC会将其他线程挂起,然后执行垃圾清理操作,垃圾
Wesley13 Wesley13
3年前
MySql 面试开发技术点汇总
表结构设计1、为什么一定要设一个主键?答:因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键。所以啦,反正都要生成一个主键,那你还不如自己指定一个主键,在有些情况下,就能显式的用上主键索引,提高查询效率!2、你们主键是用自增还是UUID?答:肯定答自增啊。innod
Wesley13 Wesley13
3年前
Mysql迁移到highgoDB如何实现ID自增长
目录环境文档用途详细信息环境系统平台:MicrosoftWindows(64bit)2012版本:5.6.4文档用途Mysql数据库迁移到HighGo数据库后,原Mysql表中自增长的ID如何保持自增长?详细信息分两种情况进行处理,具体如下:(1)数据库中已经存在表(tab1),而且已经有数据,而且
Wesley13 Wesley13
3年前
MYSQL和ORACLE的一些区别
1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。CREATESEQUENCE序列号的名称(最好是表名序列号标记)INCREMENTBY1START
Wesley13 Wesley13
3年前
mysql试题
drop,delete与truncate的区别:优先级:droptruncatedeleteTRUNCATE按行删除并不把删除操作记录记入日志保存(不可恢复)DELETE全部删除表内数据并可将删除操作记录在日志中,可以加where字句,可应用于table和viewDROP删除整个表(结构和数据)再插入时自增长id又
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Vitess全局唯一ID生成的实现方案 | 京东云技术团队
为了标识一段数据,通常我们会为其指定一个唯一id,比如利用MySQL数据库中的自增主键。但是当数据量非常大时,仅靠数据库的自增主键是远远不够的,并且对于分布式数据库只依赖MySQL的自增id无法满足全局唯一的需求。因此,产生了多种解决方案,如UUID,Sn
虚树涟漪
虚树涟漪
Lv1
无端更渡桑干水,却望并州是故乡。
文章
3
粉丝
0
获赞
0