【MySQL】为什么不推荐使用uuid或者雪花id作为主键?

文章目录

    • 1.原因
    • 2.使用uuid(或雪花ID)和自增id的索引结构对比
      • 2.1 使用自增id的内部结构
      • 2.2 使用uuid(或雪花ID)的索引内部结构
      • 2.3 使用自增id的缺点

1.原因

使用UUID或雪花ID(Snowflake ID)作为主键并不是完全不推荐的,而是根据具体的应用场景和需求来决定是否适合。

以下是一些不推荐使用UUID或雪花ID作为主键的原因:

  1. 存储空间:UUID是一个128位的值,而雪花ID通常是64位。相比之下,使用较短的整数或自增ID作为主键将占用更少的存储空间。这在大规模的数据库中尤为重要,可以节省磁盘空间、内存和网络带宽。
  2. 索引效率:UUID和雪花ID是随机生成的,没有顺序性可言。这导致在使用这些主键作为索引时,索引树的深度增加,查询效率下降。相比之下,使用自增ID或有序的整数主键可以使索引更加紧凑和快速。
  3. 数据库碎片化:使用UUID作为主键可能会导致数据库碎片化的问题。因为UUID是随机生成的,数据写入时经常涉及到页面的分裂和重组增加了磁盘I/O操作的频率,影响了性能。
  4. 难以读取和调试:由于UUID和雪花ID是较长的字符串或数字,对于人类来说不太易读和理解。在调试、分析以及人工处理数据时,使用较短的整数或自增ID作为主键更加方便。

然而,使用UUID或雪花ID作为主键也有其优势。例如,在分布式环境中,使用UUID或雪花ID可以确保全局唯一性,而不需要单个中心化的发号器。此外,使用UUID可以提供更好的数据隐私保护,因为它们具有较高的随机性。

2.使用uuid(或雪花ID)和自增id的索引结构对比

2.1 使用自增id的内部结构

在这里插入图片描述
在这里插入图片描述
自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(innodb默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的修改):

①下一条记录就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满,提升了页面的最大填充率不会有页的浪费

②新插入的行一定会在原有的最大数据行下一行,mysql定位寻址很快,不会为计算新行的位置而做出额外的消耗

减少了页分裂和碎片的产生

2.2 使用uuid(或雪花ID)的索引内部结构

在这里插入图片描述
因为uuid相对顺序的自增id来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以innodb无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空。这个过程需要做很多额外的操作,数据的毫无顺序会导致数据分布散乱,将会导致以下的问题:

①:写入的目标页很可能已经刷新到磁盘上并且从缓存上移除,或者还没有被加载到缓存中,innodb在插入之前不得不先找到并从磁盘读取目标页到内存中,这将导致大量的随机IO

②:因为写入是乱序的,innodb不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上

③:由于频繁的页分裂页会变得稀疏并被不规则的填充,最终会导致数据会有碎片

在把随机值(uuid和雪花id)载入到聚簇索引(innodb默认的索引类型)以后,有时候会需要做一次OPTIMEIZE TABLE来重建表并优化页的填充,这将又需要一定的时间消耗。

2.3 使用自增id的缺点

  1. 安全问题:如果采用自增主键,可能存在根据ID值爬取数据库记录,有安全风险;
  2. 系统重构:系统重构或者与其他系统集成时,可能存在新老主键冲突
  3. 高并发负载,innodb在按主键进行插入的时候会造成明显的锁争用,主键的上界会成为争抢的热点,因为所有的插入都发生在这里,并发插入会导致间隙锁竞争
  4. Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失;
  5. 自增主键有限,要考虑主键长度问题。

参考链接:MySql为什么不推荐使用UUID做主键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/92317.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树的存储结构(链式存储)—— 数据结构与算法

😶‍🌫️Take your time ! 😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥代码仓库:🔥🔥魔…

Linux 操作文件的系统调用

一、系统调用 系统调用表现出来的形式和库函数看着是一样的,但是系统调用的实现是在内核中,一旦执行系统调用以后,会产生中断,陷入内核,内核去执行相应的代码。我们无法直接去执行内核的代码,系统调用执行…

零基础看懂免费开源的Stable Diffusion

文章目录 前言Diffusion模型推理过程训练过程 Stable Diffusion模型参考 前言 前面一篇文章主要讲了扩散模型的理论基础,还没看过上篇的小伙伴可以点击查看:DDPM理论基础。这篇我们主要讲一下一经推出,就火爆全网的Stable Diffusion模型。St…

SQL-每日一题【1341. 电影评分】

题目 表:Movies 表:Users 请你编写一个解决方案: 查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。查找在 February 2020 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。 …

「鲸脸识别」已上线,夏威夷大学用 5 万张图像训练识别模型,平均精度 0.869

内容一览:人脸识别可以锁定人类身份,这一技术延申到鲸类,便有了「背鳍识别」。「背鳍识别」是利用图像识别技术,通过背鳍识别鲸类物种。传统的图像识别依赖于卷积神经网络 (CNN) 模型,需要大量训练图像,并且…

《3D 数学基础》12 几何图元

目录 1 表达图元的方法 1.1 隐式表示法 1.2 参数表示 1.3 直接表示 2. 直线和射线 2.1 射线的不同表示法 2.1.1 两点表示 2.1.2 参数表示 2.1.3 相互转换 2.2 直线的不同表示法 2.2.1 隐式表示法 2.2.2 斜截式 2.2.3 相互转换 3. 球 3.1 隐式表示 1 表达图元的方…

【C语言】每日一题(多数元素)

多数元素,链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票: 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢? 在一个集合中,如果一个元素…

PHP最简单自定义自己的框架model使用(七)

1、实现model使用效果 2、自动加载model,KJ.php //自动加载文件public static function _autoload($className){switch ($className){//自动model类case substr($className,-5)Model:$path MODEL./.$className..php;if(is_file($path)) include $path;break;//自动加载控制器…

机器学习理论笔记(一):初识机器学习

文章目录 1 前言:蓝色是天的机器学习笔记专栏1.1 专栏初衷与定位1.2 本文主要内容 2 机器学习的定义2.1 机器学习的本质2.2 机器学习的分类 3 机器学习的基本术语4 探索"没有免费的午餐"定理(NFL)5 结语 1 前言:蓝色是天…

隧道人员定位方案

针对隧道环境的人员定位方案,UWB定位技术同样可以提供高精度和可靠的定位服务。以下是一个可行的方案: 部署基站网络:在隧道内建立一个基站网络,基站需要均匀分布在各个关键位置,以确保全方位的覆盖。由于隧道的特殊环…

一、Dubbo 简介与架构

一、Dubbo 简介与架构 1.1 应用架构演进过程 单体应用:JEE、MVC分布式应用:SOA、微服务化 1.2 Dubbo 简介一种分布式 RPC 框架,对专业知识(序列化/反序列化、网络、多线程、设计模式、性能优化等)进行了更高层的抽象和…

SpringBoot集成Redis及Redis使用方法

目录 应用背景 Redis简介 更新问题 一:环境配置 1.1: 在pom.xml文件中添加依赖 1.2:配置SpringBoot核心配置文件application.properties 二:在Config文件夹中创建RedisConfig配置文件类 2.1:RedisTemplate中的几个角色&am…

基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析

一、项目背景 近年来,随着物流行业迅速发展,物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现,严重影响了物流作业效率,市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…

mysql-事务特性以及隔离机制

一.ACID 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。 1.逻辑架构和存储引擎 如上图所示,MySQL服务器逻辑架构从上往下可以分…

【密码学】维京密码

维京密码 瑞典罗特布鲁纳巨石上的图案看起来毫无意义,但是它确实是一种维京密码。如果我们注意到每组图案中长笔画和短笔画的数量,将得到一组数字2、4、2、3、3、5、2、3、3、6、3、5。组合配对得到24、23、35、23、36、35。现在考虑如图1.4所示的内容&a…

六、Linux系统下,文件操作命令都有哪些?

总括: 创建文件/文件夹:touch; 查看:cat/more; 复制:copy; 移动文件/文件夹:mv; 删除:rm; 1、创建文件 (1)语法&#x…

java实现docx,pdf文件动态填充数据

一,引入pom 根据需求引入自己所需pom org.apache.poi poi 4.1.1 org.apache.poi poi-ooxml 4.1.1 org.jxls jxls 2.6.0 ch.qos.logback logback-core org.jxls jxls-poi 1.2.0 fr.opensagres.xdocreport fr.opensagres.xdocreport.core 2.0.2 fr.opensagres.xdocrep…

最小生成树 — Prim算法

同Kruskal算法一样,Prim算法也是最小生成树的算法,但与Kruskal算法有较大的差别。 Prim算法整体是通过“解锁” “选中”的方式,点 -> 边 -> 点 -> 边。 因为是最小生成树,所以针对的也是无向图,所以可以随意…

MySql011——检索数据:过滤数据(使用正则表达式)

前提:使用《MySql006——检索数据:基础select语句》中创建的products表 一、正则表达式介绍 关于正则表达式的介绍大家可以看我的这一篇博客《Java038——正则表达式》,这里就不再累赘。 二、使用MySQL正则表达式 2.1、基本字符匹配 检索…

Java版企业电子招投标采购系统源码之首页设计 tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…