mysql主键自增策略_MySQL 自增主键机制

mysql主键自增策略_MySQL 自增主键机制自增主键:特指在自增列上定义的主键。自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。1.自增值保存在哪?不同的存储引擎保存自增值的策略不一样;a.对于MyISAM引擎,自增值保存在数据文件中;b.Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。每次重启后第一次打开表,都会去查找自增值的最大值max(id),并设置表当前自增值为ma…

大家好,又见面了,我是你们的朋友全栈君。

自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。

1. 自增值保存在哪?

不同的存储引擎保存自增值的策略不一样;

a. 对于MyISAM引擎,自增值保存在数据文件中;

b. Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。每次重启后第一次打开表,都会去查找自增值的最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值。

2. 自增值修改策略?

a. 在插入时如不指定或指定为0,null,则使用当前的自增值填到自增字段;并设置当前自增值=当前自增值+auto_increment_increment 步长;

b. 指定了具体的值,若指定值小于当前自增值,则自增值不发生改变;若大于当前自增值,则自增值为指定值+auto_increment_increment;

3. 自增值的修改时机?

a. 自增值修改发生在插入数据的操作之前,如果插入失败,自增值不会再修改回去;

b. 事务回滚也不会将自增值修改回去;

c. 为了减少自增id锁带来的性能影响,mysql不会修改回去之前的自增值;

4. 自增锁的优化

a. 自增锁不是事务锁,在每次申请完就释放;在5.0版本会在语句执行完才释放,后续版本无须在语句执行完才释放;支持批量申请;

b. 一次性insert多条记录时,如果能计算出需要多少个id,就一次性申请,申请完就释放;

c. insert … select 默认会使用语句级的锁,只有语句执行完才会释放自增锁,为了数据的一致性;

d. 而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 的策略(注:该策略是导致自增 id 不连续的第三种原因。):语句执行过程中,第一次申请自增 id,会分配 1 个;1 个用完以后,这个语句第二次申请自增 id,会分配 2 个;2 个用完以后,还是这个语句,第三次申请自增 id,会分配 4 个;依此类推,同一个语句去申请自增 id,每次申请到的自增 id 个数都是上一次的两倍。

e. 对于批量插入数据,使用insert … select, replace … select 和load data语句时,可设置innodb_autoinc_lock_mode=2, binlog_format=row提高并发性,保证一致性;

5. 自增值到达上限

自增值不再变化,再次申请时,得到的值保持不变。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147797.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一维卷积神经网络的理解是什么_卷积神经网络的输入

    一维卷积神经网络的理解是什么_卷积神经网络的输入设输入的数据维度是BxSxT一维卷积神经网络在维度S上进行卷积如下,设置一维卷积网络的输入通道为16维,输出通道为33维,卷积核大小为3,步长为2#in_channels:16#out_channels:33#kernel_size:3m=nn.Conv1d(16,33,3,stride=2)input=torch.randn(20,16,50)output=m(input)#shapeofoutputis([20,33,24

    2022年9月22日
    0
  • JS : clearInterval()失效,无法暂停setInterval()的原因[通俗易懂]

    JS : clearInterval()失效,无法暂停setInterval()的原因[通俗易懂]环境:我在函数A调用函数B,函数B里写了setInterval()。原因:页面加载时我调用了2次函数A,导致调用了2次setInterval(),导致有setInterval_id有2个值。clearInterval()只关闭了其中一个setInterval_id,另一个setInterval_id还会启动setInterval()。改为只调用一次函数A即可。…

    2025年7月13日
    0
  • Java语言实现自动关机程序

    Java语言实现自动关机程序@Java实现自动关机系统Java语言实现自动关机程序该项目实现了以下任务:1、提示用户,欢迎使用某某关机程序2、提示用户,输入倒计时关机的秒数3、根据用户输入的秒数,进行自动关机4、开始自动关机时,提示用户xxx秒后关机项目具体代码我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的

    2022年7月22日
    7
  • hadoop平台搭建_eclipse安卓开发环境搭建

    hadoop平台搭建_eclipse安卓开发环境搭建参看:GettingStartedGuideforDM368DM365LeopardBoard参看:DAVINCIDM365-DM368开发攻略——开发环境搭建(DVSDK4.02)一、下载相应软件包下载:相应软件包二、安装Ubuntu10.04网上教程很多,参看:在VMware虚拟机上安装Ubuntu10.04

    2022年8月13日
    3
  • rc522优点_51单片机rc522接线图

    rc522优点_51单片机rc522接线图公司需要做刷卡模块,因此选了RC522做demo程序。下面就RC522知识做简要的总结。本人使用stm32的硬件spi接口搭建工程,相关的配置如下:spi配置:引脚配置SDA——-PA4SCLK—-PB13MOSI——-PB15MISO——PB14IRQ—没接RST—-PB0//PB12–NSSPB13–SCKPB14–…

    2022年9月19日
    0
  • Maven(1) 安装与配置(配置本地仓库路径)

    Maven(1) 安装与配置(配置本地仓库路径)第一步:安装JDK并配置环境变量(注意:全部配置到系统变量或者用户变量!!)cmd输入java-version验证是否安装第二步:安装maven进入官网下载Maven:https://maven.apache.org/download.cgi解压maven就安装好了哦~~第三步:maven环境变量配置①MAVEN_HOME–>…

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号