17611538698
webmaster@21cto.com

停止在数据库中使用 UUID

数据库 0 690 2024-06-03 11:07:32

图片

导读:UUID 如何破坏数据库性能,请大家来看本文。

唯一标识数据库中的行的最常见方法是使用UUID 字段。

然而我们也必须注意,这种方法实际上存在着性能问题。在本文中,我们讨论了在数据库表中使用 UUID 作为键时会出现的两个性能问题。

事不宜迟...让我们开始!

什么是 UUID?


UUID 代表通用唯一标识符(Universally Unique Identifier,缩写:UUID)。

UUID 目前有很多个版本,但在本文中我们只考虑最流行的版本:UUIDv4。

以下,是 UUIDv4 的示例:

图片

请注意:每个 UUID 都在相同位置上,用数字4来表示版本号。

问题 1 — 插入的性能


当将新记录插入表中时,必须更新与主键相关联的索引以保持最佳查询性能。

索引是使用 B+ 树数据结构构建的。

对于每个记录插入,必须重新平衡底层 B+ 树以优化查询性能。

对于 UUID 来说,重新平衡过程变得非常低效。

这是因为 UUID 固有的随机性,使得保持树的平衡变得更加困难。

随着规模的扩大,您将需要重新平衡数百万个节点,这会大大降低使用 UUID 键时的插入性能。

问题 2 — 更高的存储量


让我们考虑具有自动递增整数键的 UUID 的大小:

相比之下,自动递增整数每个值消耗 32 位,而 UUID 每个值消耗128 位。

每行多 4 倍。

此外,大多数人以人类可读的形式存储 UUID,这意味着每个 UUID 值最多可消耗688 位。

每行大约多 20 倍。

让我们通过模拟真实的数据库来评估 UUID 实际上如何影响您的存储。

我们将在此示例中调整Josh Tried Coding使用的表格:

  • 表 1将包含 100 万行带有 UUID 的数据。

  • 表 2将包含 100 万行带有自动递增整数的数据。


以下是结果,让我们逐一分析一下每个统计数据:

图片

总表大小:考虑两个表大小时,UUID 表大约比整数表大2.3 倍!

ID 字段大小:单个 UUID 字段比等效整数字段需要9.3 倍的存储空间!

ID 列大小:当排除每个表中的其他属性时, UUID 和整数列之间的大小差异为3.5 倍!

结论


UUID 是确保表中记录之间唯一性的好方法。


这些问题在规模上很普遍,因此 UUID 在实际场景不会对大多数项目造成明显的性能下降。


尽管这些问题在规模上很普遍,但认识到在表中使用 UUID 的含义,并确保最佳的数据库设计非常重要。

作者:校长

评论