UUID主键生成策略

简介: 【7月更文挑战第9天】在分库分表场景中,自增主键不再适用,面试时应提及这一挑战。主键生成策略包括UUID,虽简单但有两弊端:长度过长且非递增。递增主键能优化存储,避免页分裂导致的性能下降。准备时需了解常见策略、创新方案及优化措施。例如,UUID的非递增性可能导致数据库的页分裂和性能影响。

首先需要把话题引到主键生成上,如果接触过使用分库分表的项目,那么在简历和项目介绍的时候一定要提及分库分表关键词,后面等面试官主动问你主键是如何生成的。
面试过程中被问到了数据库自增主键相关的问题,那么要主动提起自增主键不适用于分库分表场景,然后面试官自然就会追问分库分表场景下主键的生成问题。

准备工作:

  1. 深入理解市面上常见的主键生成策略
  2. 准备一个有亮点、微创新的主键生成方案
  3. 记住一些可行的优化方案

常见主键生成策略

UUID

最简单粗暴的方案,也是面试的时候必须要回答出来的一种策略。如果想要拉开差距,即使是最简单的UUID方案也需要下一番功夫,首先需要详细地解释UUID的两个弊端

  • 过长:这个弊端在面试里讨论的比较少,毕竟采用UUID的地方就不会在意它的长度
  • UUID不是递增的:要重点描述的,并且要尝试刷出亮点

亮点1:页分裂

UUID不是递增的这个弊端,要想讲清除,就要先描述为什么会希望在数据库里面使用自增主键。那么可以引用数据库为什么使用自增主键的知识点来回答这个问题,关键词就是页分裂
如果你尝试往23之后插入一个25,这个叶子节点已经放不下了,不得已需要分裂成(20,21)和(22,23,25)两个节点。原本的(10,20,30)多了一个元素之后变成了(10,20,22,30),即页分裂这个东西是可能引起连锁反应的,从叶子节点沿着树结构一路分裂到根节点
可以这样回答

UUID最大的缺陷是它产生的ID不是递增的。一般来说,我们倾向于在数据库中使用自增主键,因为这样可以迫使数据库的数朝着一个方向增长,而不会造成中间叶节点分裂,这样插入性能最好。而整体上UUID生成的ID可以看作是随机,那么就会造成导致数据往页中间插入,引起更加频繁地页分裂,在糟糕的情况下,这种分裂可能引起连锁反应,整棵树的树形结构都会受到影响。所以我们普遍倾向于采用递增的主键。

目录
相关文章
|
6月前
|
Oracle Java 关系型数据库
JPA主键生成策略介绍
【1月更文挑战第9天】本篇 Huazie 向大家介绍 JPA主键生成策略
126 5
JPA主键生成策略介绍
|
Java 数据库
如何使用JPA的UUID主键生成策略
这篇文章只写给主键用uuid并且用jpa的小伙伴。 1. 数据实体类 @Entity @Table(name = "ip_user") @GenericGenerator(name = "jpa-uuid", strategy = "uuid") ...
3697 0
|
6月前
|
存储 关系型数据库 MySQL
用雪花 ID 和 UUID 做 MySQL 主键,可以吗?
用雪花 ID 和 UUID 做 MySQL 主键,可以吗?
112 0
用雪花 ID 和 UUID 做 MySQL 主键,可以吗?
|
存储 算法 安全
全局唯一ID(自增ID、UUID、雪花算法)
一、介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中,几乎都需要对大量的数据和消息进行唯一标识。在设计初期,我们需要考虑日后数据量的级别,如果可能会对数据进行分库分表,那么就需要有一个全局唯一id来标识一条数据或记录。生成唯一id的策略有多种,但是每种策略都有它的适用场景、优点以及局限性。
UUID.randomUUID().toString() 生成主键 介绍与使用
UUID.randomUUID().toString() 介绍 UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。 UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字 它保证对在同一时空中的所有机器都是唯一的 是由一个十六位的数字组成,表现出来的形式
226 0
uuid v4
第四版uuid
313 0
|
JavaScript 前端开发