前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 主键自增注意事项

MySQL 主键自增注意事项

作者头像
江南一点雨
发布于 2024-06-07 06:57:27
发布于 2024-06-07 06:57:27
55900
代码可运行
举报
文章被收录于专栏:玩转JavaEE玩转JavaEE
运行总次数:0
代码可运行

很多小伙伴应该知道,在 MySQL 中主键不应该使用随机字符串。但是主键不用随机字符串用什么?主键自增?主键自增就是最佳方案吗?有没有其他坑?今天我们就来讨论下这个话题。

1. 为什么不用 UUID

经过上篇文章的介绍,我们知道在 MySQL 中,主键索引就是聚簇索引,MySQL 表中的数据是根据主键值聚集在一起的,聚簇索引是一棵 B+Tree,这棵树中的数据是有序的。

所以,如果我们使用 UUID 字符串作为主键,那么就会导致每次数据插入的时候,都需要在 B+Tree 中寻找到适合它自己的位置,找到之后就有可能要挪动后面的节点(就像在数组中插入一条记录),挪动后面的节点,就有可能涉及到页分裂,插入效率就会降低。

另一方面,在非聚簇索引中,叶子结点保存的是主键值,主键如果是一个很长的 UUID 字符串,就会占据较大的存储空间(相对 int 而言),那么同一个叶子结点能够保存的主键值数量就会减少,进而可能会导致树变高,树变高,意味着查询的时候 IO 次数增加,查询效率降低。

基于上面的分析,我们在 MySQL 中尽量不使用 UUID 作为主键,不用 UUID,可能会有小伙伴想到,那我使用主键自增行不行?

对于上面提到的两个使用 UUID 作为主键的问题,使用主键自增显然都可以解决。主键自增,每次只需要往树的末尾添加就行了,基本上不会涉及到页分裂问题;主键自增意味着主键是数字,占用的存储空间相对来说就比较小,对非聚簇索引的影响也会小一些。

那么主键自增就是最佳方案吗?主键自增有没有一些需要注意的问题?

2. 主键自增的问题

以下内容,有一个共同的大前提,就是我们的表设置了主键自增。

一般来说,主键自增是没有什么问题的。但是,如果在高并发环境下,就会有问题了。

首先最容易想到的就是在高并发插入的时候产生的尾部热点问题,并发插入时,大家都需要去查询这个值然后计算出自己的主键值,那么主键的上界就会成为热点数据,并发插入时这里会产生锁竞争。

为了解决这个问题,我们就需要选择适合自己的 innodb_autoinc_lock_mode

2.1 数据插入的三种形式

首先,我们在向数据表中插入数据的时候,一般来说有三种不同的形式,分别如下:

  1. insert into user(name) values('javaboy') 或者 replace into user(name) values('javaboy') ,这种没有嵌套子查询并且能够确定具体插入多少行的插入叫做 simple insert,不过需要注意的是 INSERT ... ON DUPLICATE KEY UPDATE 不算是 simple insert
  2. load data 或者 insert into user select ... from ....,这种都是批量插入,叫做 bulk insert,这种批量插入有一个特点就是插入多少条数据在一开始是未知的。
  3. insert into user(id,name) values(null,'javaboy'),(null,'江南一点雨'),这种也是批量插入,但是跟第二种又不太一样,这种里边包含了一些自动生成的值(本案例中的主键自增),并且能够确定一共插入多少行,这种称之为 mixed insert,对于前面第一点提到的 INSERT ... ON DUPLICATE KEY UPDATE 也算是一种 mixed insert

将数据插入分为这三类,主要是因为在主键自增的时候,锁的处理方案不同,我们继续往下看。

2.2 innodb_autoinc_lock_mode

我们可以通过控制 innodb_autoinc_lock_mode 变量的值,来控制在主键自增的时候,MySQL 锁的处理思路。

innodb_autoinc_lock_mode 变量一共有三个不同的取值:

  • 0: 这个表示 traditional,在这种模式下,我们上面提到的三种不同的插入 SQL,对于自增锁的处理方案是一致的,都是在插入 SQL 语句开始的时候,获取到一个表级的 AUTO-INC 锁,然后当插入 SQL 执行完毕之后,再释放掉这把锁,这样做的好处是可以确保在批量插入的时候,自增主键是连续的。
  • 1: 这个表示 consecutive,在这种模式下,对 simple insert(能够确定具体插入行数的,对应上面 1、3 两种情况)做了一些优化,由于 simple insert 插入多少行这个很好计算,于是可以一次性生成几个连续的值用在对应的插入 SQL 语句上,这样就可以提前释放掉 AUTO-INC 锁,可以减少锁等待,提高并发插入效率。
  • 2: 这个表示 interleaved,这种情况下不存在 AUTO-INC 锁,来一个处理一个,批量插入的时候,就有可能出现主键虽然自增,但是不连续的问题。

从上面的介绍中小伙伴们可以看到,实际上第三种,也就是 innodb_autoinc_lock_mode 取值为 2 的情况下,并发效率是最强的,那么我们是不是就应该设置 innodb_autoinc_lock_mode=2 呢?

这得看情况。

松哥之前写过一篇文章和小伙伴们介绍 MySQL binlog 日志文件的三种格式:

  • row:binlog 中记录的是具体的值而不是原始的 SQL,举一个简单例子,假设表中有一个字段是 UUID,用户执行的 SQL 是 insert into user(username,uuid) values('javaboy',uuid()),那么最终记录到 binlog 中的 SQL 是 insert into user(username,uuid) values('javaboy',‘0212cfa0-de06-11ed-a026-0242ac110004’)
  • statement:binlog 中记录的就是原始的 SQL 了,以 row 中的为例,最终 binlog 中记录的就是 insert into user(username,uuid) values('javaboy',uuid())
  • mixed:在这种模式下,MySQL 会根据具体的 SQL 语句来决定日志的形式,也就是在 statement 和 row 之间选择一种。

对于这三种不同的模式,很明显,在主从复制的时候,statement 模式可能会导致主从数据不一致,所以现在 MySQL 默认的 binlog 格式都是 row。

回到我们的问题:

  • 如果 binlog 格式是 row,那么我们就可以设置 innodb_autoinc_lock_mode 的值为 2,这样就能尽最大程度保证数据并发插入的能力,同时不会发生主从数据不一致的问题。
  • 如果 binlog 格式是 statement,那么我们最好设置 innodb_autoinc_lock_mode 的值为 1,这样对于 simple insert 的并发插入能力进行了提高,批量插入还是先获取 AUTO-INC 锁,等插入成功之后再释放,这样也能避免主从数据不一致,保证数据复制的安全性。
  • 以上两点主要是针对 InnoDB 存储引擎,如果是 MyISAM 存储引擎,都是先获取 AUTO-INC 锁,插入完成再释放,相当于 innodb_autoinc_lock_mode 变量的取值对 MyISAM 不生效。

2.3 实践

接下来我们来通过一个简单的 SQL 来和小伙伴们演示一下 innodb_autoinc_lock_mode 不同取值对应不同结果的情况。

首先,我们可以通过如下 SQL 查看当前 innodb_autoinc_lock_mode 的取值:

可以看到,我使用的 8.0.32 这个版本目前默认值是 2。

我先把它改成 0,修改方式就是在 /etc/my.cnf 文件中添加一行 innodb_autoinc_lock_mode=0

改完之后再重启查看,如下:

可以看到,现在就已经改过来了。

现在假设我有如下表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这个自增是从 100 开始计的,现在假设我有如下插入 SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into user(id,username) values(1,'javaboy'),(null,'江南一点雨'),(3,'www.javaboy.org'),(null,'lisi');

插入完成之后,我们来看查询结果:

按照我们前文的介绍,这个情况应该是可以解释的通的,我这里不再赘述。

接下来,我把 innodb_autoinc_lock_mode 取值改为 1,如下:

还是上面相同的 SQL,我们再执行一遍。执行完成之后结果也和上文相同。

但是!!!当上面的 SQL 执行完毕之后,如果我们还想再插入数据,并且新插入的 ID 不指定值,则我们发现自动生成的 ID 值为 104。这就是因为我们设置了 innodb_autoinc_lock_mode=1,此时,执行 simple insert 插入的时候,系统一看我要插入 4 条记录,就直接给我提前拿了 4 个 ID 出来,分别是 100、101、102 以及 103,结果该 SQL 实际上只用了两个 ID,剩下两个没用,但是下次插入还是从 104 开始了。

3. 小结

好啦,这就是关于主键自增的一个小小知识点,小伙伴们一定要根据实际情况来为 innodb_autoinc_lock_mode 属性取一个合适的值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江南一点雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微步在线:半年融资8亿,综合型网络安全“新贵”诞生
2021年3月17日,微步在线宣布完成E轮5亿元人民币融资,此轮由CPE源峰领投,老股东云晖资本等继续跟投。
科技云报道
2022/04/16
1.3K0
微步在线:半年融资8亿,综合型网络安全“新贵”诞生
2023年顶级网络安全并购交易
经济衰退、利率上升、大规模科技裁员,支出也变得保守,对于这些因素的担忧,交易撮合者也因此变得谨慎。然后,应对更大规模、更快攻击的需求更加迫切,这也促使2023 年的并购交易行动持续进行。
FB客服
2023/11/17
4390
2023年顶级网络安全并购交易
2018广受关注的20家国际网络安全公司
Gartner预测,2019年全球网络安全市场收益预期将达1240亿美元。纵观2018年,全球范围内网络安全行业的老玩家和新兴力量都实现了战略转型,描绘出了行业发展的图景:专注于特定领域的小型安全供应商快速成长,像亚马逊、思科一样的大公司则开始收购各种小公司和初创企业来保护他们软件和服务产品。
FB客服
2018/12/18
9910
2018广受关注的20家国际网络安全公司
CrowdStrike:零摩擦,零信任
CrowdStrike占据全球网络安全公司市值排行榜的首位,已经有相当长一段时间了。作为一家以终端安全打天下、以安全云服务立天下、上市一年半即市值第一的安全公司,其传奇发展令人着迷。
网络安全观
2021/12/31
3.1K0
CrowdStrike:零摩擦,零信任
14家值得关注的网络安全公司
鉴于其庞大的规模,亚马逊在安全领域所做的任何事情都具有重要意义。因此,该公司1月份对Sqrrl的收购值得注意,因为它突显了亚马逊对威胁搜索作为快速检测和缓解网络威胁的方式的有效性的信心。
SDNLAB
2018/12/17
1.3K1
CrowdStrike故障导致全球宕机事件始末
在网络安全领域,CrowdStrike作为全球领军安全公司之一,提供了先进的终端保护和威胁情报服务。然而,2024年7月的一场全球宕机事件揭示了即便是顶尖网络安全公司也会面临的技术和管理挑战。这场事件不仅对众多企业和组织造成了巨大影响,同时也暴露了复杂网络系统中的潜在脆弱性。本文将详细介绍此次故障事件的发生、技术细节分析及其带来的损失和启示。
星尘安全
2024/08/12
3570
CrowdStrike故障导致全球宕机事件始末
独立 SOAR 的终结?Google以5亿美元收购以色列网络安全初创公司Siemplify
Google正在收购以色列网络安全初创公司、SOAR供应商Siemplify。收购的价格估计为5亿美元,这是Google首次收购活跃在网络安全领域的以色列公司。Siemplify在以色列、美国和伦敦有200名员工,他们将在收购后加入Google。有分析师认为,这笔交易是独立 SOAR 和安全信息与事件管理 (SIEM) 市场终结的信号。
SDNLAB
2022/01/19
4200
独立 SOAR 的终结?Google以5亿美元收购以色列网络安全初创公司Siemplify
20个炙手可热的网络安全新产品 | 直击RSAC2022
近年来,网络安全产业处于高速发展之中,各种极具创新精神和价值的新产品、新技术如千帆竞渡、百舸争流般层出不穷,进一步丰富了网络安全行业的产品图谱。 同时,全球网络安全领域的融资热度大幅攀升。据 Crunchbase 的统计数据,2022年第一季度网络安全初创公司的投资金额接近60亿美元,同比增加高达50%,但环比低于2021年第四季度的82亿美元。 2022年6-9日,这些受到资本追捧的初创企业带着他们的网络安全产品亮相RSAC 2022,其中包括语音欺诈监控工具、攻击面管理平台、人工智能的电子邮件安全平台
FB客服
2023/03/30
1K0
20个炙手可热的网络安全新产品 | 直击RSAC2022
斗象科技CEO谢忱:中美网安市场分化明显,“平行宇宙”初现
当今世界,以云计算、大数据、人工智能为代表的科技革命在全球蓬勃兴起,随着国内外具有共识性的热门技术在各行各业广泛地应用,整个世界似乎正在迅速地融为一体。
FB客服
2022/04/11
3250
斗象科技CEO谢忱:中美网安市场分化明显,“平行宇宙”初现
抓风口,筑安全,2024 数字安全十大技术趋势预测
2023 年是技术爆发的一年,ChatGPT、量子计算、常温超导体争相刷新眼球;2023 年是风云变幻的一年,局部战争、网络战、全球经济震荡交替冲击……无数个值得记忆的瞬间,都对网络安全行业产生着深远影响。
FB客服
2024/01/04
3310
抓风口,筑安全,2024 数字安全十大技术趋势预测
RSAC明天开幕,谁会成为网安行业最牛黑马?
4 月 24 日,网络安全行业年度盛会 RSA Conference(美国信息安全大会)将在旧金山隆重开幕。此次大会以“Stronger Together(携手更强大)”为主题,议程主要包含安全研讨会、沙盒创新大赛、安全技术主题演讲等,预计参会人数继续破万。 创新始终是网络安全行业持续发展的澎湃动力,也是网络安全从业者奋斗进步坚持的初心 。对于创新,每年的 RSAC 大会倾注了大量资源,搭建起创新企业都想登台展示的平台-RSAC 创新沙盒大赛。 创新沙盒比赛自推出以来,一直是 RSAC 最受瞩目的活动,被
FB客服
2023/04/26
3450
RSAC明天开幕,谁会成为网安行业最牛黑马?
2023全球网安最强创新企业诞生了
经过一天”激烈厮杀“, 4 月 25 日,RSAC 2023 创新沙盒大赛”冠军“角逐落下帷幕,致力于人工智能技术网络安全研究的 HiddenLayer 最终斩获大赛冠军,成为2023年全球网络安全最牛的那匹黑马。 从创新沙盒大赛十强厂商的演讲视频来看,各参赛选手的演讲内容基本围绕人工智能技术本身的安全性以及如何使用人工智能技术解决网络安全问题, 经过角逐,Hidden Layer 凭借其创新性,获得了评委以及现场观众的认可,笑到最后。 值得一提的是,虽然 HiddenLayer 获得了”冠军“,但部分分
FB客服
2023/04/26
1K0
2023全球网安最强创新企业诞生了
内生安全,是数据安全厂商的蜜糖还是砒霜?
在这个数字化时代,网络安全的重要性日益凸显。随着网络攻击手段的不断升级和数据泄露事件的频发,传统的外生安全措施——即在现有系统之外增加防御层——已经难以满足当前的安全需求。内生安全,作为一种新兴的安全理念,强调从系统设计之初就将安全作为核心考量,从而实现更为根本和全面的保护。
数据猿
2024/05/17
2460
内生安全,是数据安全厂商的蜜糖还是砒霜?
从十八线熬到一线,网络安全行业的新故事
1995年,中国第一家网络安全企业——天融信公司成立(从有记录的工商信息查询得知),掀开了中国网络安全行业发展的序幕。此后的短短数年,启明星辰、卫士通、绿盟科技等安全公司相继成立。这些公司成为了中国网络安全行业的“黄埔军校”,向互联网企业、安全厂商,乃至后来的云服务商,以及各行各业的安全岗位源源不断地输送安全人才,影响至今。
腾讯安全
2022/02/14
8160
从十八线熬到一线,网络安全行业的新故事
2022 年值得关注的 10 家最热门 XDR 安全公司
“ 编者按 据研究机构 Forrester 称,扩展检测和响应 (XDR) 市场目前还处于早期阶段,现有的 XDR 产品成熟度各有不同。成熟的 XDR 供应商结合了其产品组合中的最佳元素,以简化事件响应并构建有针对性的高效检测机制。相比之下,不太成熟的供应商则使用 XDR 作为其产品组合的统一层,对用户和组织几乎没有增加价值。 而介于两者之间的供应商拥有新兴的、原生的和混合的 XDR 功能,但仍处于早期阶段,并且大多数强调的是端点检测和响应 (EDR) 功能。 本文介绍了2022 年值得关注的 10 家最热
SDNLAB
2022/03/04
1.5K0
2015全球网络安全市场报告(上)
《全球网络安全市场报告》是美国网络安全公司Cybersecurity Ventures发布的季度报告。报告内容包括来自IT分析公司关于市场规模及行业预测等综合研究、发展潮流、就业、联邦政府部门、全球网络安全企业500强热门公司、著名的并购案例、投资及IPO活动等。 由于原文篇幅相当长,FreeBuf将此报告分为多部与各位分享。 一、市场规模及预测 全球网络安全市场由市场规模预测确定,据预测2014年的市场规模为710亿美元,到2019年将超过1550亿美元。 ● 高德纳公司(Garner)曾预测全球信息
FB客服
2018/02/06
1.2K0
2015全球网络安全市场报告(上)
Cylance公司筹集1.2亿美元,利用AI保护网络安全
Cylance是一家利用人工智能和机器学习来打击网络攻击的网络安全初创公司,在E轮融资中已经筹集了1.2亿美元,由Blackstone Tactical Opportunities领导。
AiTechYun
2018/07/27
7800
Cylance公司筹集1.2亿美元,利用AI保护网络安全
直击RSA 2020大会,看业界大佬如何“搅局”网络安全市场
RSA大会(RSA Conference)是网络安全行业历来最大的年度活动之一,该会议于本周一在旧金山举行。作为网络安全行业风向标,从1991年至今,RSA大会已经走过29个年头。RSA大会主题一年一变,从去年的“Better”变为“Human Element”,意味着人在未来安全行业发展中将发挥不可或缺的作用。
SDNLAB
2020/02/27
7240
直击RSA 2020大会,看业界大佬如何“搅局”网络安全市场
微软正式将GPT-4引入安全,行业颠覆真的来了?
北京时间3月28日23:30,微软安全开启全球直播,重磅推出Microsoft Security Copilot——正式宣布将GPT-4引入网络安全。 据微软称,Security Copilot将不断学习和改进,提供对最先进的OpenAI模型的持续访问,以支持要求苛刻的安全任务和应用程序。 同时,Security Copilot是全球首款真正意义上的AI安全产品,借助微软庞大的全球威胁情报和每天数十万亿个信源提供的信息,以快速检测、响应来帮助企业更好地应对当下日益严峻的网络安全形势。Security Cop
FB客服
2023/03/29
4870
微软正式将GPT-4引入安全,行业颠覆真的来了?
【行研】FreeBuf Insight | 网络安全创新企业Top 10解读之FireEye
* FreeBuf研究院出品,作者/欧阳洋葱,未经许可禁止转载 在FreeBuf Insight上一篇《网络安全创新企业Top 10》系列文章中,我们谈到了Sophos。虽然在安全领域Sophos已经
FB客服
2018/02/08
1.8K0
【行研】FreeBuf Insight | 网络安全创新企业Top 10解读之FireEye
推荐阅读
相关推荐
微步在线:半年融资8亿,综合型网络安全“新贵”诞生
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验