我为什么不建议开发中使用UUID作为MySQL的主键

数据库主键到底是用自增长好还是UUID好 各位同学好,今天给大家讲一下MySQL数据库在设计主键时,应该使用哪种数据类型。我们知道,咱们在设计数据库时,主键是必须设置的。一般情况下,咱们都会选择使用主键自增或者UUID这两种主键策略。那么这两个哪种更好呢?我们应该使用哪一种呢,今天就请大家跟老徐来一起来学习一下吧。 阅读详情

我是少侠露飞。学习塑造人生,技术改变世界。

引言

我在之前一篇博客专门介绍了MySQL聚簇索引和非聚簇索引,附传送门:
【享学MySQL】系列:MySQL索引的数据结构,索引种类及聚簇索引和非聚簇索引
简单来说,就是我们设计表的时候,基本都会人为设定一个主键,这就是聚簇索引(如果没有设定主键,MySQL会选择非空不唯一的字段作为聚簇索引,如果依然没有,则MySQL会选择自己隐藏列row_id作为聚簇索引)。
MySQL主键分为自增主键和UUID两种形式。今天我们就针对这个主键的生成深入探究一下。

自增主键和UUID比较

首先需要明确一点,自增主键是整数,UUID是字符串类型(一般为36位)。

所以UUID相比自增主键一个首要的缺点就是UUID主键索引占据空间更大。

其次我们再来分别来看看两种主键生成方式插入数据时发生的情况。

自增主键的插入:

在这里插入图片描述
如上图所示,InnoDB把每条记录都保存在前一条记录的后面,因为主键的值是顺序的。当达到页面最大的填充因子(Fill Factor)(InnoDB初始的填充因子是15/16),后一条记录就会写入新页面。

UUID主键的插入

在这里插入图片描述
由于新行的主键不一定比前一个大,因此InnoDB不能总是把新行插入到索引的最后。它不得不为新行寻找合适的位置:通常在已有数据的中段,并且为它分配空间。这会导致大量的额外工作并且导致不优化的数据布局。主要缺点如下:

  • 目标页面也许会被刷写到磁盘上并且从缓存中移走,无论哪种情况,InnoDB都不得不在插入新行之前从磁盘上找到并读取它,这导致了大量的随机I/O。
  • InnoDB有时不得不进行分页,为新行开辟空间。这会导致移动大量数据。
  • 页面会因为分页而变得稀疏和不规则地被填充,因此最终的数据会有碎片。

因此通过UUID的方式插入数据花费的时间也更长。

MySQL自增主键的实现

自增锁的值保存位置

InnoDB引擎的自增值,在MySQL5.7及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值max(id),然后将max(id)+步长作为这个表当前的自增值

select max(id) from table_name for update;

在MySQL8.0版本,将自增值的变更记录在了redo log中,重启的时候依靠redo log恢复重启之前的值。

自增锁的实现

自增id锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请。

但在MySQL5.0版本的时候,自增锁的范围是语句级别。也就是说,如果一个语句申请了一个表自增锁,这个锁会等语句执行结束以后才释放

MySQL5.1.22版本引入了一个新策略,新增参数innodb_autoinc_lock_mode,默认值是1

1.这个参数设置为0,表示采用之前MySQL5.0版本的策略,即语句执行结束后才释放锁。

2.这个参数设置为1。

  • 普通insert语句,自增锁在申请之后就马上释放 。
  • 类似insert … select这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放。

3.这个参数设置为2,所有的申请自增主键的动作都是申请后就释放锁。

所以当发生主键冲突和事务回滚都会导致自增主键id不连续的情况。

思考

事实上开发中基本采用自增主键的方式。但是主键顺序一定是不会造成坏的结果么?
答案当然是否定的。
自增主键为了防止多个线程返回同样的主键,生成主键的过程必然是要加自增锁的,但是在高并发的场景下,冲突的概率就大大提高了,并发插入很可能会竞争下一个自增锁,即会带来InnoDB内部单点竞争。

深入分析mysql为什么不推荐使用uuid或者雪花id作为主键 前言: 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?本篇文章我们就来分析这个问题,探讨一下内部的原因。 一、mysql和程序实例 1.要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key 阅读详情

相关推荐

使用uuid做MySQL主键,被老板,爆怼一顿

前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?本篇博客我们就来分析一下这个问题,探讨一下内部的原因。1.1:要说明这个问题,我们首先来建立三张表,分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变

weixin_57907028的博客 1万+

MySQL中使用UUID做主键时需要注意的两个坑(译文)

越来越多的人在MySQL数据库使用UUID作为表的主键。大家都知道,对于MySQL的InnoDB存储引擎,主键非常重要!它对性能、内存和磁盘空间的影响巨大。

姚远OracleACE的博客 6782

为什么MySQL官方不推荐使用uuid而是推荐连续自增的主键id作为主键?

在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处? 为了研究这个问题,我们先来建三张表。 分别是user_auto_key,user_uuid,user_random_key,分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变. 根据控制变量法,我们只把每个表的主键使用不同的策略

代码从一开始的博客 2582

MySql 主键一般用自增ID还是UUID

14、主键一般用自增ID还是UUID? (1)自增ID: 使用自增ID的好处: 字段长度较 UUID 会小很多。 数据库自动编号,按顺序存放,利于检索 无需担心主键重复问题 使用自增ID的缺点: 因为是自增,在某些业务场景下,容易被其他人查到业务量。 发生数据迁移时,或者表合并时会非常麻烦 在高并发的场景下,竞争自增锁会降低数据库的吞吐能力 (2)UUID:通用唯一标识码,UUID是基于当前时间、计数器和硬件标识等数据计算生成的。 使用UUID的优点: 唯一标识,不用考虑重复问题,在数据拆分

书香水墨 5246

UE4/5项目GPU崩溃?可能是Windows的TDR机制在搞鬼!深入浅出聊聊TdrDelay与显卡超时

本文深入探讨了UE4/5项目中GPU崩溃的常见原因,揭示了Windows TDR机制的工作原理及其对渲染进程的影响。通过调整TdrDelay参数和优化GPU负载,提供了解决显卡超时问题的实用方案,帮助开发者提升项目稳定性。

weixin_30691649的博客 410

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中,同时不断着力提升自己的 AI 技能。面对 AI 问题,工程师首先要了解什么是 AI,以及如何将它纳入当前工作流,这看似简单,实则未必容易。在 Google 中搜索“什么是 AI?”会得到数百万条结果,包括不同程度的技术和相关信息。那么,对工程师而言,AI 意味着什么?人们对 AI 的关注主要集中在 AI 模型上,受此影响,工程师会迅速投入 AI 建模的研究。

r1832644594的博客 2815

在 Mysql 中, 主键应该使用自增还是 uuid ?

这两种 id 哪一种比较好 ,我们在新建一张表的时候该怎么考虑主键的使用 ,今天就来好好的研究一下 。

六等星的小宇宙 1578

一种四通道高精度IEPE加速度传感器控制器设计稿

一种四通道高精度IEPE加速度传感器控制器设计稿,颇具参考价值。

boyondmcu的博客 3853

为什么mysql主键不建议用字符串_我为什么不建议开发中使用UUID作为MySQL的主键...

我是少侠露飞。学习塑造人生,技术改变世界。引言我在之前一篇博客专门介绍了MySQL聚簇索引和非聚簇索引,附传送门:【享学MySQL】系列:MySQL索引的数据结构,索引种类及聚簇索引和非聚簇索引简单来说,就是我们设计表的时候,基本都会人为设定一个主键,这就是聚簇索引(如果没有设定主键,MySQL会选择非空不唯一的字段作为聚簇索引,如果依然没有,则MySQL会选择自己隐藏列row_id作为聚簇索引)...

weixin_42355256的博客 4673

直流无刷BLDC六步换相“电流环”、“速度环”的关系

4、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载非正常变化,例如速度严重“超速”时,需要“限速”保护,这个任务是“速度环”的,这时“速度环”会根据设定的速度上限,控制触发器,将电机速度迅速将下来,电流降下来,在“限速”保护期间,“电流环”失去对触发器的控制作用;3、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载正常变化,“速度环”对速度大小的控制作用是没有的;6、很多人想当然,“电流环”不工作,电机“电流”哪里来的?

u011878611的博客 5471

一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

(产生多路频率、占空比的PWM)

weixin_56688599的博客 7935

mysql invalid uuid_我为什么不建议开发中使用UUID作为MySQL的主键

我是少侠露飞。学习塑造人生,技术改变世界。引言我在之前一篇博客专门介绍了MySQL聚簇索引和非聚簇索引,附传送门:【享学MySQL】系列:MySQL索引的数据结构,索引种类及聚簇索引和非聚簇索引简单来说,就是我们设计表的时候,基本都会人为设定一个主键,这就是聚簇索引(如果没有设定主键,MySQL会选择非空不唯一的字段作为聚簇索引,如果依然没有,则MySQL会选择自己隐藏列row_id作为聚簇索引)...

weixin_39915210的博客 630

手把手教你复现IEEE 2025高光谱图像盲超分算法DBSR(附开源代码与避坑指南)

本文详细介绍了如何从零复现IEEE 2025高光谱图像盲超分算法DBSR,包括环境配置、数据预处理、核心模块解析、训练策略及常见问题解决方案。特别针对开源代码中的关键步骤和潜在问题提供了实用指南,帮助研究者和开发者高效实现Deep blind super-resolution技术,适用于遥感、医疗等领域的图像增强应用。

weixin_42524708的博客 413

mysql uuid主键 分页_关于mysql:我为什么不建议开发中使用UUID作为MySQL的主键

我是少侠露飞。学习塑造人生,技术扭转世界。引言我在之前一篇博客专门介绍了MySQL聚簇索引和非聚簇索引,附传送门:【享学MySQL】系列:MySQL索引的数据结构,索引品种及聚簇索引和非聚簇索引简略来说,就是咱们设计表的时候,根本都会人为设定一个主键,这就是聚簇索引(如果没有设定主键,MySQL会抉择非空不惟一的字段作为聚簇索引,如果仍然没有,则MySQL会抉择本人暗藏列row_id作为聚簇索引)...

weixin_31265041的博客 395

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

实操微信支付,适合第一次接通微信支付的同学

我的实际操作命令如下:就会生成图3中多出来的file文件夹,/Users/camel/cert/xxxxxx_cert/file/wechatpay_5A4xxxxxxxxxx9.pem,wechatpay_xxxxx5A4849E9.pem就是微信支付平台证书,也是程序真正需要的。•注意:我的操作说明,我是把下载好的 CertificateDownloader.jar 文件,放在了解压证书的目录里(图3)。//下面的静态参数要仔细看下面的解释,否则只会调用别人写好的方法,压根学不会0-1接入微信支付。

wjianwei666的专栏 525

mysql根据类型uuid分区_我为什么不建议开发中使用UUID作为MySQL的主键

我是少侠露飞。学习塑造人生,技术改变世界。引言我在之前一篇博客专门介绍了MySQL聚簇索引和非聚簇索引,附传送门:【享学MySQL】系列:MySQL索引的数据结构,索引种类及聚簇索引和非聚簇索引简单来说,就是我们设计表的时候,基本都会人为设定一个主键,这就是聚簇索引(如果没有设定主键,MySQL会选择非空不唯一的字段作为聚簇索引,如果依然没有,则MySQL会选择自己隐藏列row_id作为聚簇索引)...

weixin_39687786的博客 203

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

mysql使用自增长主键而不使用雪花主键或者uuid的探讨

https://blog.youkuaiyun.com/zqxdsy/article/details/79758194?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161028255716780299086178%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D

ddx_ddv的博客 707

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

美团一面:为什么 MySQL 不推荐使用雪花 id 和 uuid 做主键?大部分人都会答错!

本篇博客首先从开篇的提出问题,建表到使用jdbcTemplate去测试不同id的生成策略在大数据量的数据插入表现,然后分析了id的机制不同在mysql的索引结构以及优缺点,深入的解释了为何uuid和随机不重复id在数据插入中的性能损耗,详细的解释了这个问题。在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。

2401_83384536的博客 822

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

美团一面:为什么MySQL不推荐使用雪花id和uuid做主键?大部分人都会答错!

本篇博客首先从开篇的提出问题,建表到使用jdbcTemplate去测试不同id的生成策略在大数据量的数据插入表现,然后分析了id的机制不同在mysql的索引结构以及优缺点,深入的解释了为何uuid和随机不重复id在数据插入中的性能损耗,详细的解释了这个问题。本篇博客我们就来分析这个问题,探讨一下内部的原因。因为uuid相对顺序的自增id来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以innodb无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。

码农code之路 102

MySql为什么不推荐使用UUID做主键

设计MySQL数据库表的时候,一定会考虑主键的设计。mysql官方推荐不要使用uuid或者不连续不重复的雪花id,推荐连续自增的主键id,官方的推荐是auto_increment。为什么不建议采用uuid,使用uuid究竟有什么坏处? 如果设计表不设置主键,MySQL官方有以下说明: If you do not define aPRIMARY KEYfor your table, MySQL picks the firstUNIQUEindex that has onlyNOT NULLc...

西木风落 1万+

MySql主键id不推荐使用UUID

昨天在某个技术群中,有个老哥发送了一个技术视频:讲的是一个毕业生面试被问,前后端的交互ID是使用自增的吗?为什么不使用UUID?最后的解释是说性能问题,这个引起了我的兴趣,查了一下资料总结一下。自增的主键的值是顺序的,所以 Innodb 把每一条记录都存储在一条记录的后面。

zth_killer的博客 3273

为什么官方不建议使用uuid做MySQL主键

本篇博客首先从开篇的提出问题,建表到使用jdbcTemplate去测试不同id的生成策略在大数据量的数据插入表现,然后分析了id的机制不同在mysql的索引结构以及优缺点,深入的解释了为何uuid和随机不重复id在数据插入中的性能损耗,详细的解释了这个问题。在实际的开发中还是根据mysql的官方推荐最好使用自增id,mysql博大精深,内部还有很多值得优化的点需要我们学习。本篇博客demo地址httpshttpshttpshttpshttpshttpshttpshttpshttps。...

wufaqidong1的博客 3433

面试官:为什么不推荐使用 uuid 作为 mysql 主键?

主键是数据库表中的一个字段(或字段的组合),它具有唯一性、不为空性、数据完整性、关系参照、索引等特点和作用。其中主键的每个值必须唯一,用以区分表中的每条记录,也就是说一个表中不可能同时存在相同主键值的记录。索引数据库系统通常会为主键自动创建索引,从而提高基于主键的查询和访问数据的效率。在日常使用中,查询占据的比例往往是最大的,然而随着数据量的增大,在不使用索引作为辅助的时候,查询效率会越来越低。所以我们在使用MySQL的时候,往往都会建立索引,帮助优化查询效率。

码农小郑有话说的博客 1570

MySQL不建议使用UUID作为主键的原因

前言 以前只知道UUID不适合作为主键,但是不知道具体原因,最近做了了解,在此做一个记录 索引 我们先了解一下mysql索引的数据结构,mysql在innodb的存储引擎下是使用B+树来做为索引的数据结构的,而一个表最终必定会创建一个主键索引,即是没有设置主键也会有生成规则(先查找有没有非空的唯一索引,没有则可以使用默认的rowid字段创建索引) mysql中存储数据的最小单元称之为page(页),大小为16KB,也就是在索引的结构中一个page存储了很多个数据,看下图 我们首先知道索引采用B+树的结构后,

qq_31086797的博客 5021
上一篇: 【Redis】拼多多面试官问我zset底层是如何实现的,我反手就把跳表的数据结构画了出来
下一篇: 【数据结构与算法】腾讯面试官让我模拟快排的执行过程,背好的代码竟无用武之地
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值