在分布式系统设计中,生成全局唯一的 ID 是最基础的需求。多年来,UUID (Universally Unique Identifier) 一直是事实上的标准。
但随着数据量的爆炸,UUID 在数据库性能上的短板逐渐暴露,而 ULID (Universally Unique Lexicographically Sortable Identifier) 作为后起之秀,正在被越来越多的新项目采用。
本文将深入对比两者的优劣,帮你决定谁才是你的“真命天子”。
UUID:老当益壮的标准
UUID (v4) 是由 32 个十六进制数字组成的字符串,通常用连字符分为五组。
- 示例:
f47ac10b-58cc-4372-a567-0e02b2c3d479 - 工具:在线 UUID 生成器
优点
- 绝对标准:几乎所有编程语言和数据库都内置支持。
- 安全性:v4 版本完全随机,无法从中推测出生成时间或机器信息。
缺点
- 无序性(致命伤):UUID v4 是完全随机的。如果用作数据库主键(Primary Key),每次插入数据都会导致 B+ 树索引的大量随机 IO 和页分裂,严重拖慢写入性能。
- 体积大:128 位,通常以 36 字符的字符串存储,浪费空间。
ULID:为数据库而生
ULID 设计之初就是为了解决 UUID 的无序问题。它由 26 个字符组成(Base32 编码)。
- 示例:
01ARZ3NDEKTSV4RRFFQ69G5FAV - 工具:在线 ULID 生成器
结构揭秘
ULID = 48位时间戳 + 80位随机数
优点
- 按字典序排序:这是它最大的杀手锏。由于前 48 位是时间戳,生成的 ID 是单调递增的。这使得数据库在插入新数据时,只需要在索引树的末尾追加,极大提升了写入性能。
- 不包含连字符:URL 安全,且比 UUID 短(26 vs 36 字符)。
- 兼容性:本质上依然是 128 位,可以无缝转换成 UUID 格式存储。
选型建议
| 维度 | UUID (v4) | ULID |
|---|---|---|
| 有序性 | 无序 (Random) | 有序 (Sorted) |
| 索引性能 | 差 (随机 IO) | 优 (顺序 IO) |
| 安全性 | 高 (不暴露时间) | 中 (暴露生成时间) |
| 长度 | 36 字符 | 26 字符 |
- 选择 ULID:如果你需要用作数据库主键,或者需要对 ID 进行时间排序。
- 选择 UUID:如果你需要极高的安全性(不想让别人通过 ID 猜出数据创建时间),或者在维护遗留系统。