导读: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 的含义,并确保最佳的数据库设计非常重要。
作者:校长