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

我个人始终觉得,大多数技术是没有优劣之分的,在适合的地方使用,它就是最好的!

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

如果你面试遇到这个问题(面试官并没有给出对应的场景,那么这家公司要不要去,是一个值得好好考虑的事情),那么首先有一点,你需要明确:

什么是主键?它的作用是什么?

主键是数据库表中的一个字段(或字段的组合),它具有唯一性、不为空性、数据完整性、关系参照、索引等特点和作用。

其中 主键 的每个值必须唯一,用以区分表中的每条记录,也就是说一个表中不可能同时存在相同主键值的记录。
索引 数据库系统通常会为主键自动创建索引,从而提高基于主键的查询和访问数据的效率。

在日常使用中,查询占据的比例往往是最大的,然而随着数据量的增大,在不使用索引作为辅助的时候,查询效率会越来越低。
所以我们在使用MySQL的时候,往往都会建立索引,帮助优化查询效率。

在MySQL中,所有的操纵语句都会经过 解析 -> 优化 -> 执行,然后与存储引擎交互,根据执行器的要求,存储引擎从数据文件中读取或写入数据。

MySQL数据库支持多种存储引擎,每种引擎都有其特定的优势和应用场景,常见的有InnoDB和MyISAM,简单说明一下:

1、InnoDB:

特点: 支持事务处理,具有提交、回滚和崩溃恢复能力。提供外键约束以维护数据完整性。支持行级锁定和MVCC(多版本并发控制),适合处理高并发事务。
应用场景: 适用于需要高事务安全的应用,如在线交易处理(OLTP)。

2、MyISAM:

特点: 不支持事务处理和行级锁定,但读取速度快。支持全文索引,适合读密集型的表。
应用场景: 适用于读取操作远多于写入操作的场景,如数据仓库。

&nbsp

大部分情况下,我们采用的都是InnoDB这种存储引擎,
InnoDB引擎采用 B+Tree 结构来作为索引结构,B+树的叶子节点是有序的并且相互连接,支持高效的范围查找和排序操作,
B+Tree 内部节点不存储数据,只存储键值,这意味着可以在内部节点存储更多的键,从而减少了树的高度,提高查询效率。

B++树图

&nbsp

主键的选择

UUID

&nbsp

很多人不推荐使用UUID的原因

在数据库主键的选择上,为什么很多人不推荐使用UUID作为MySQL主键,主要的考虑的点是性能和存储效率。

  • UUID的大小和存储效率

UUID是一个128位长的数字,通常以36个字符(包含4个短横线)的字符串形式表示。相比之下,传统的整型主键(如自增的INT或BIGINT)占用的空间要小得多。例如,一个INT类型只占用4个字节,而一个UUID字符串则需要16个字节。这意味着使用UUID作为主键会占用更多的磁盘空间,增加I/O操作的成本。

  • 索引效率问题

在MySQL中,主键会被用来构建聚集索引。由于UUID的随机性,新插入的行的主键值在存储位置上并不连续。这导致MySQL数据库在插入新数据时,需要频繁地重新调整数据的物理存储顺序,从而导致索引碎片化,降低了索引效率。

  • 性能影响

由于UUID的随机性和较大的存储空间需求,使用UUID作为主键可能导致较慢的查询性能。尤其是在大数据量的情况下,索引的大小将显著增加,从而减慢了查询速度。

由于UUID的长度,它占用的内存也比较大。这意味着数据库缓存中可以存放的索引和数据行数量会减少,进一步影响了数据库的性能。

主键如何选择

上面说了为什么很多人不推荐使用UUID作为主键的原因,但在特定场景下,使用UUID作为数据库主键是推荐的:

1、分布式系统:
在分布式系统中,数据可能跨多个数据库或服务器。在这种环境下,使用UUID可以保证主键的全局唯一性,避免不同节点之间主键冲突的问题。这对于确保数据一致性和完整性至关重要。

2、并发插入的场景:
当有多个进程或服务器同时向数据库插入数据时,使用自增主键可能会导致性能瓶颈或冲突,因为每次插入都需要访问同一个计数器。UUID由于其唯一性,可以在客户端生成,降低了对数据库的依赖,减少了并发操作的复杂性。

3、需要保护数据顺序的场合:
使用自增主键可能会暴露数据的增长趋势或量级信息。UUID由于其无序和不可预测的特性,可以在一定程度上隐藏数据的增长情况,对安全性有所帮助。

4、数据合并和同步:
在需要合并或同步多个数据库的场合,UUID作为主键可以简化数据整合过程。因为UUID的唯一性,即使是来自不同来源的数据,在合并时也不会发生主键冲突。

5、系统重构和迁移:
在系统重构或迁移过程中,尤其是当系统架构发生变化(如从单体架构迁移到微服务架构)时,使用UUID作为主键可以减少因主键冲突引发的问题,使迁移过程更加平滑。

综上所述,虽然UUID作为主键在存储和性能方面可能存在不足,
但在需要确保主键全局唯一性、减少并发冲突、提高数据安全性等方面,UUID是一个很好的选择。
因此,在设计数据库和选择主键时,应根据应用的具体需求和场景来决定是否使用UUID。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记和面经,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的阿里大佬写的刷题笔记,让我offer拿到手软

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑聊编程

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

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

相关文章

阿里员工:本月收入489325元,开心过年

阿里员工:本月收入489325元,开心过年 近日,一名阿里员工在社交媒体上爆料自己的本月收入,竟然高达48.9万,真是让人目瞪口呆。 震惊之余,大家都很好奇这么高收入是怎么来的,再仔细看工资单&…

力扣LeetCode第80题 删除有序数组中的重复项 II

一、题目 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示…

HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目,都用到了蓝牙模块,如:手机和stm32的通信,电赛中的双车通信,还是遥感小车的…

X-AnyLabeling 图像标注工具及模型自动标注;json2yolo格式转换、yolo训练数据集划分

一、X-AnyLabeling 图像标注工具及模型自动标注 参考:https://github.com/CVHub520/X-AnyLabeling 1、下载 直接https://github.com/CVHub520/X-AnyLabeling/releases/tag/下载对应版本 软件打开: 2、自定义标注模型yaml构建 这里自定义模型自动标注加载预训练的yolov8…

LeetCode994腐烂的橘子(相关话题:矩阵dfs和bfs)

题目描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单…

Unity坦克大战开发全流程——游戏场景——敌人——移动的敌人

游戏场景——敌人——移动的敌人 制作预制体 将坦克拖拽至场景中进行设置 写代码 让坦克在两点之间不停移动 随机坐标函数 然后在start()中调用即可 坦克要一直盯着玩家 当小于一定距离时,攻击玩家 重写开火逻辑 注意还要将其tag改成Monster! 当敌人死…

虚拟化分类和实现原理

6、虚拟化分类 (1)完全虚拟化 直接将Hypervisor跑在0环内核态,客户机os跑在1环,一旦触发敏感指令,由0环的VMM进行捕获翻译,从而模 拟这些指令。而运行在1环的GuestOS永远都不知道自己是个虚拟机。是完全…

【Transformer】深入理解Transformer模型2——深入认识理解(上)

前言 Transformer模型出自论文:《Attention is All You Need》 2017年 近年来,在自然语言处理领域和图像处理领域,Transformer模型都受到了极为广泛的关注,很多模型中都用到了Transformer或者是Transformer模型的变体&#xff0…

OpenCV实战 -- 维生素药片的检测记数

文章目录 检测记数原图经过操作开始进行消除粘连性--形态学变换总结实现方法1. 读取图片:2. 形态学处理:3. 二值化:4. 提取轮廓:5. 轮廓筛选和计数: 分水岭算法:逐行解释在基于距离变换的分水岭算法中&…

关于链表的一些问题

求链表的中间节点 可以定义两个指针,一个一次走两步一个一次走一步,当走的快的走到NULL时,走的慢的就是链表的中间节点。(此法求出的偶数个节点的链表的中间节点是它中间的第二个) 求倒数第K个节点 也可以定义两个指…

PowerShell Instal 一键部署gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

新手快速上手掌握基础排序<一>

目录 引言 一:两数互换排序 1.画图分析 2.代码实现 二:三数换交换排序 1.例题举例 2.代码实现 3.再比如四数互换排序,也可以使用两数互换的方法来实现 ,但最好使用基础的排序方法(冒泡法,选择法) 三&#xf…

PointNet人工智能深度学习简明图解

PointNet 是一种深度网络架构,它使用点云来实现从对象分类、零件分割到场景语义解析等应用。 它于 2017 年实现,是第一个直接将点云作为 3D 识别任务输入的架构。 本文的想法是使用 Pytorch 实现 PointNet 的分类模型,并可视化其转换以了解模…

【python】爬取百度热搜排行榜Top50+可视化【附源码】【送数据分析书籍】

一、导入必要的模块: 这篇博客将介绍如何使用Python编写一个爬虫程序,从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应,以及os模块处理文件和目录操作。 如果出现模块报错 进入控制台输入&#xff…

android开发调用百度地图api实现加载地图和定位

目录 一.踩的一些坑以及解决方法 1.权限声明不要少 2.地图初始化 3.定位问题 (1)监听器注册 (2)定位监听器类MyLocationListener的实现 (3)定位功能的调用 4.android studio连接真机调试问题 二.…

MySQL:索引

MySQL官方对索引的定义为: 索引 (Index) 是帮助MySQL高效获取数据的数据结构。 提取句子主干,就可以得到索引的本质:索引是数据结构。 1. 什么是索引,索引的作用 索引是一种用于快速查询和检索数据的数据结构,帮助mysql提高查询效率的数据…

ros2查看launch文件内需要提供的参数(接口):

格式:ros2 launch --show-args 包名称 launch文件名称 例如: ros2 launch --show-args ros_gz_sim gz_sim.python.py

行人重识别优化:Pose-Guided Feature Alignment for Occluded Person Re-Identification

文章记录了ICCV2019的一篇优化遮挡行人重识别论文的知识点:Pose-Guided Feature Alignment for Occluded Person Re-Identification 论文地址: https://yu-wu.net/pdf/ICCV2019_Occluded-reID.pdf Partial Feature Branch分支: PCB结构,将…

精致旅游网ROXANDREA 网页设计 html模板

一、需求分析 旅游网站通常具有多种功能,以下是一些常见的旅游网站功能: 酒店预订:旅游网站可以提供酒店预订服务,让用户搜索并预订符合其需求和预算的酒店房间。 机票预订:用户可以通过旅游网站搜索、比较和预订机票…

JavaScript 工具库 | PrefixFree给CSS自动添加浏览器前缀

新版的CSS拥有多个新属性,而标准有没有统一,有的浏览器厂商为了吸引更多的开发者和用户,已经加入了最新的CSS属性支持,这其中包含了很多炫酷的功能,但是我们在使用的时候,不得不在属性前面添加这些浏览器的…