面试官:为什么不推荐使用 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万,真是让人目瞪口呆。 震惊之余,大家都很好奇这么高收入是怎么来的,再仔细看工资单&…

C语言-破解密码

题目描述 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设老王原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换…

vue3 ts面试题 常问面试题(连更中.......有错 欢迎提出)

Vue2 和 vue3 区别 Api? 升级v3是因为 v2有一些基础bug 例如数据丢失等 但是 v3就解决了这个问题 v3利用了双向数据绑定 数值变化页面就该变 v2 和 v3 的 api 不一样 v2的api是选择式的 v3是组合式的 例如 setup就是组合的 v2 和 v3 的生命周期也不太一样 v2 和 v3 …

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

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

excel数据使用xlsx读取转换成JSON

一般读取excel的工作都由后端完成,比如java使用poi插件。如果存在少量非敏感数据,比如日志、模板数据,可以直接由前端搞定。 使用xlsx插件 在线json格式化、excel转json测试 一、安装 可以安装以下版本,不会出现问题 yarn ad…

Mysql 中子查询时order by与group by合用无效的解决办法

存在一个需求: 需要获取某些条件下,在分组后,取最新的记录。 比如有张学生分数表,里面包含了学生一年的所有考试的语数外成绩,我想要获取同学A的最后一次考试成绩。 select * from ( select * from student_score wh…

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

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

R语言【stats】——处理R对象中的缺省值:na.fail(), na.omit(), na.exclude(), na.pass()

Package stats version 4.3.2 Parameters na.fail(object, ...)na.omit(object, ...)na.exclude(object, ...)na.pass(object, ...) 参数【object】:R 对象,通常是一个数据帧。 参数【...】:特殊方法可能需要的其他参数。 目前&#xff0…

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 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单…

【C#与Redis】--实践案例--案例 3:使用 Redis 实现排行榜

实现一个基本的排行榜系统通常涉及到对分数进行排序,而 Redis 的 Sorted Set 数据结构非常适合这种用途。以下是一个使用 StackExchange.Redis 库在 C# 中实现排行榜的简单案例: 安装 StackExchange.Redis 库: Install-Package StackExchan…

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个节点 也可以定义两个指…

9 权限与特权

一,访问级别 权限和特权共同决定了对API对象(例如窗口和会话)的访问级别。 权限和特权是两个不同的概念。权限定义了执行某些操作的能力,例如设置属性。特权是根据角色类型授予的权限集合。 请注意,在创建(例如 screen_create_())或销毁(例如 screen_destroy_())对…

PowerShell Instal 一键部署gitea

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

【动态规划】673. 最长递增子序列的个数

673. 最长递增子序列的个数 解题思路 本题改造最长递增子序列但是最长子序列的长度不止一个dp数组代表以nums[i]结尾的最长子序列长度count[i]代表以nums[i]结尾的最长子序列的个数那么当nums[i]大于前面的元素nums[j]的时候,计算dp[i]和dp[j] 1的大小&#xff0…

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

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