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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • generic host process已停止工作_windows error reporting 1001

    generic host process已停止工作_windows error reporting 1001故障现象:今天在虚拟机里装了win2003系统,每次重启进入系统时都会报错:generichostprocessforwin32services遇到了一个问题需要关闭。解决方法:先从google查了下相关问题,觉得没一个说来符合我的实际情况。于是回头仔细查看日志,怀疑是安装文件太旧引起的。于是更新补丁,当安装完了提示的99个补丁后,再重启进入系统,…

    2022年10月11日
    9
  • Docker 常用命令!还有谁不会?[通俗易懂]

    Docker 常用命令!还有谁不会?

    2022年2月19日
    39
  • CentOS7制作本地yum源(EPEL)步骤

    CentOS7制作本地yum源(EPEL)步骤很多情况下机器上不了互联网 无法使用默认的 yum 源安装软件 因此搭建本地 yum 源非常有必要 准备工作配置网络等 创建 yum 源用到的目录 mkdir p data soft epel data soft centos7 配置本机 yum 源方法一 使用阿里源阿里源配置相对方便 具体帮助见 https developer aliyun com mirror 备份 CentOS Base repomv etc yum repos d CentOS Base repo etc yu

    2025年10月12日
    4
  • 颜色空间RGB与HSV(HSL)的转换

    颜色空间RGB与HSV(HSL)的转换

    2021年12月16日
    56
  • 数字逻辑中的与或非异或的运算规律_执行逻辑与或非运算

    数字逻辑中的与或非异或的运算规律_执行逻辑与或非运算计算机中的逻辑运算又被称作为“布尔运算”,分别为:逻辑**与**运算、逻辑**或**运算,逻辑**非**运算,“逻辑**异或**运算。此外在门电路中还有:**同或**运算、**与非**运算、**或非**运算。共七种。……

    2022年10月12日
    2
  • 详解C/C++中volatile关键字「建议收藏」

    详解C/C++中volatile关键字「建议收藏」一、volatile介绍volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:这段…

    2022年6月1日
    26

发表回复

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

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