面试官:为什么不推荐使用 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拿到手软

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

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

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值