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


相关推荐

  • 嵌入式C语言面试题_c语言基础面试题

    嵌入式C语言面试题_c语言基础面试题预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)         #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何…

    2022年8月27日
    6
  • Kali如何使用Reaver破解Wi-Fi网络的WPA/WPA2密码

    Kali如何使用Reaver破解Wi-Fi网络的WPA/WPA2密码   首先,我们需要在虚拟机VMware中安装kali系统,关于如何安装kali系统,我的博客里也有介绍;然后要准备一个USB无线网卡,我用的是小米随身wifi。   我们要先了解Reaver的原理:它利用了WiFi保护设置(WiFiProtectedSetup-下文中简称为WPS)的一个弱点,WPS是许多路由器上都有的一个功能,可以为用户提供简单的配置过程,它与设备中硬编…

    2022年6月2日
    136
  • 英语字母s的发音规则_S汉字的发音

    英语字母s的发音规则_S汉字的发音英语发音规则S字母一、总结一句话总结:1、S 在音节开头或清辅音前/s/?2、S 在元音字母间或浊辅音前/z/?3、Sh发/ʃ/?4、Sc-发/sk/或/s

    2022年8月2日
    8
  • python语法(二)——截取字符串的方法详解

    python语法(二)——截取字符串的方法详解下面是基于python2+版本;python3+print输出的内容要加括号str=’0123456789’printstr[0:3]#截取第一位到第三位的字符printstr[:]#截取字符串的全部字符printstr[6:]#截取第七个字符到结尾printstr[:-3]#截取从头开始到倒数第三个字符之前printstr[2]#截取第三个字符printstr[-1]…

    2022年5月10日
    41
  • NOIP 2008 普及组 传球游戏「建议收藏」

    NOIP 2008 普及组 传球游戏「建议收藏」超时#include<bits/stdc++.h>usingnamespacestd;intn,m,ans;//第cnt次传球后,球在编号为x的同学手上voiddfs(intcnt,intx){ if(cnt==m){ if(x==0)ans++; return; } dfs(cnt+1,(x+1)%n); dfs(cnt+1,(x-1+n)%n); }intmain(){.

    2022年7月14日
    57
  • STL库简介_库喜龙电话

    STL库简介_库喜龙电话一、前言STL是c++中的一个标准模板库,作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。二、什么是STL”什么是STL?”,假如你对STL还知之甚少,那么我…

    2022年10月16日
    4

发表回复

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

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