在设计数据库时,一个常见的决定是如何唯一地标识表中的行。UUID(通用唯一标识符)是一种流行的选择,因为它们确保了全局唯一性,但在大规模使用时,它们可能会引入显著的性能和存储挑战。在这篇博客中,我们将详细介绍什么是UUID,它们可能引起的性能问题,以及开发人员普遍更喜欢的更好的替代方案。我们还将探讨何时UUID是您数据库的正确选择。
UUID(通用唯一标识符)是一种用于在计算机系统中唯一标识对象或记录的128位数字。有多个版本的UUID,但最常用的是UUIDv4,它是通过随机生成的。以下是一个UUIDv4的示例:
e942bbe9-azdc-4c62-a438-47fee77954b6
在上面的示例中,您可以知道它是UUIDv4,因为在第13位上出现了数字“4”。这是UUID版本的一个关键标识符。
当您需要生成不需要系统间协调的全局唯一标识符时,UUID特别有用,这使得它们非常适合分布式应用程序。然而,将UUID用作数据库键,尤其是作为主键,会带来一些性能缺点。
大多数数据库使用B+树来组织索引以实现快速查找。每次向表中插入记录时,必须重新平衡B+树以保持查询优化。
对于一个使用自增整数键的表,记录按顺序添加,这意味着数据库可以轻松地将它们放置在树中的正确位置。但对于本质上是随机的UUID来说,插入点分散在B+树中,导致频繁的重新平衡。
随着您的数据库扩展到数百万行,这种不断重新平衡会导致插入性能显著下降。
与传统的自增整数键相比,UUID要大得多。以下是它们的比较:
- 自增整数:每个值32位。
- UUIDs:每个值128位。
这意味着每行需要多4倍的存储空间!此外,许多系统以人类可读格式存储UUID,这消耗了更多空间(最多688位每个值,比整数多20倍)。
考虑到整体存储成本,对于拥有数百万行的表,使用UUID会显著增加数据库大小。
考虑两个表,一个使用UUID键,另一个使用自增整数键。每个表包含100万行:
- 总表大小:UUID表大约比整数表大2.3倍。
- ID字段大小:单个UUID字段需要比整数字段多9.3倍的存储空间。
- ID列大小:UUID列比整数列大3.5倍。
这些存储差异会显著影响查询性能和存储大量数据集的成本。
尽管UUID被广泛使用,但在某些用例中,有更好的替代方案可以提供更好的性能和效率:
- 是什么:UUIDv7是一种基于时间版本的UUID,这意味着标识符按递增顺序生成。
- 为何更好:由于UUID是基于时间生成的,它们是有序的,这导致比随机性的UUIDv4更好的索引性能。其结构仍然提供全局唯一性,但没有了UUIDv4主要的插入性能惩罚。
- 最佳用途场景:需要全局唯一性但希望避免随机插入导致索引变慢的用例。
- 是什么:自增整数是由数据库为每个新行自动生成的顺序数字。
- 为何更好:自增整数的顺序性质使其对插入和索引非常高效。它们使用最少的存储空间(每值32位),并提供出色的查询性能。
- 最佳用途场景:小到中型数据库或单一系统应用程序,不需要全局唯一性。
- 是什么:ULID是一种也具有全局唯一性的UUID替代方案,但具有按字典排序的额外优点。
- 为何更好:ULID使用基于时间戳前缀,然后是随机数。这允许在保持全局唯一性的同时有效地按排序顺序插入。
- 最佳用途场景:需要UUID但按顺序排序对性能很重要的分布式系统。
尽管有缺点,但在某些情况下,尤其是当需要全局唯一性时,UUID仍然是最佳选择。以下是一些适合使用UUID的场景:
- 分布式系统: 在多个节点或系统独立生成ID的分布式应用程序中,UUID确保无须协调即可实现全局唯一性。
- 合并来自多个来源的数据: 如果您的用例需要将来自多个数据库或系统的数据合并,UUID可以防止记录之间发生冲突。
- 外部暴露: UUID比简单整数更难猜测或预测,使其在URL或API中外部暴露时更安全。
然而,如果您正在构建一个单一系统应用程序或不需要合并来自不同来源的数据,那么使用自增整数或基于时间戳版本如UUIDv7或ULID通常是更好的选择。
虽然UUID提供了全局唯一性,并且在分布式系统中至关重要,但当用于数据库时,它们会带来显著的性能和存储缺点——特别是由于其随机性质而导致的问题。在需要排序和更好插入性能时,请考虑像UUIDv7或ULID这样的替代方案。对于简单应用程序,自增整数仍然是经过验证的方法。
是否使用UUID取决于您的系统需求。如果全局唯一性至关重要,特别是对于分布式系统来说,难以超越。而如果性能和存储空间优先,请考虑适合您用例的其他选项。
点赞点赞点赞
收藏收藏收藏
关注关注关注
祝您无bug~
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sqlbc/62229.html