UUID7与UUID4简单比较

UUID(通用唯一标识符)是一种用于标识信息的标准化方法。UUID版本4是最常见的UUID版本,它基于随机数生成。

UUID 版本 4 是什么?
UUID 是通用唯一标识符的缩写,是一个 128 位标识符,表示为由破折号分隔的字母和数字组成的 32 个字符序列,格式为 8-4-4-4-12。

UUID 版本 4 的结构(例如“123e4567-e89b-12d3-a456–426655440000”)显示了其十六进制值,每个字符的范围从“1”到“f”。该唯一标识符可以作为字符串或 16 字节存储在数据库中。

无论是完全随机生成还是通过伪随机生成器生成,UUID 版本 4 都保持其卓越的唯一性。

3.26*10^6 UUID 的样本有 99.99% 的机会没有任何重复项

UUID 版本 7 是什么?
与 UUID v4 类似,UUID v7 是一个 128 位标识符,表示为 32 个字符的字母和数字序列,格式为 8–4–4–4–12。

UUID v7 的显着特征在于其作为时间排序 UUID 的本质,在最高有效 48 位中以毫秒精度编码 Unix 时间戳。

与 UUID 格式一致,4 位表示 UUID 版本,2 位表示变体。其余 74 位是随机生成的,从而保证了该标识符的唯一性。

为什么使用 UUID 而不是顺序 ID?
让我们概述一下 UUID 与顺序 ID 相比的优缺点:
UUID 优点:

  • 1.低冲突概率:由于其结构,UUID 的冲突概率非常低,允许服务器在插入之前为记录生成 ID。
  • 2.适合分布式系统: UUID非常适合分布式数据库和系统,因为它们可以在服务器上独立生成。
  • 3.增强的安全性: UUID 通过保持记录匿名、防止用户(或恶意实体)推断有关记录创建顺序的信息来提高数据库安全性。

UUID 缺点:
  • 1.增加存储空间:与传统ID(例如,INT 为4 字节或BIGINT 为8 字节)相比,UUID 占用更多存储空间(16 字节)。
  • 2.手动数据输入困难: UUID 的复杂性使得手动数据输入具有挑战性。
  • 3.降低查询性能:较大的 UUID 大小会导致查询性能降低,因为增加的记录大小会导致每个数据库页存储的记录减少,从而导致更多的 I/O 操作并降低整体性能。
  • 4.索引和数据碎片: UUID 会导致索引和数据碎片,影响数据库效率。关于这一点有必要进一步讨论。

UUID v4与UUID v7 比较


索引:
  • UUID v4 ID 彼此之间缺乏相关性,因为它们由于其完全随机的性质而表现出较差的索引局部性。因此,新生成的 UUID v4 的十六进制值可能小于旧的 UUID v4 的十六进制值。
  • UUID v7 由于其基于时间的性质而本质上是排序的。这生成的值几乎是连续的,一致地插入到最后一页的末尾(如果所有服务器都同步)。这一特性有效地消除了索引局部性问题。

数据库缓存:

  • UUID v4 问题是ID非常随机,缓冲池很快就被填满,每条记录都可以位于不同的页面上,因此数据库引擎将去获取它,如果缓冲池已满,它应该写一页或更多页到磁盘以释放一些空间,下一条记录可能会或可能不会在我们刚刚写入的同一页中,并且此循环将继续进行。
  • 在 UUID v7 或串行整数的情况下不会发生这种情况,因为记录的 ID 被授予按递增顺序。因此,当达到页数限制时,记录将添加到最后一页。数据库引擎将创建一个新页面,可能会将旧页面写入磁盘,也可能等待缓冲池被填满并只写入 WAL。