UUID 优缺点分析

UUID 是最简单的分布式 ID 方案,让我们深入分析它的优缺点。

优点

1. 完全唯一 ⭐⭐⭐⭐⭐

保证

UUID 使用 128 位空间
空间大小:2^128 ≈ 3.4 × 10^38

碰撞概率

生成 10^18 个 UUID
碰撞概率 < 0.0000000001%

实践证明

  • 经过几十年实践验证
  • 全球广泛使用
  • 从未发生实际碰撞

2. 无需协调 ⭐⭐⭐⭐⭐

本地生成

优势

  • ✅ 无网络开销
  • ✅ 无延迟
  • ✅ 无中心依赖
  • ✅ 分布式友好

3. 生成速度快 ⭐⭐⭐⭐⭐

性能

QPS:> 1,000,000
延迟:< 0.001ms
CPU:单核 80%

对比

UUID:1,000,000 QPS
数据库自增:50,000 QPS
雪花算法:500,000 QPS

4. 标准化 ⭐⭐⭐⭐

标准化程度

  • RFC 4122 国际标准
  • 所有主流语言支持
  • 广泛的生态系统

语言支持


5. 分布式友好 ⭐⭐⭐⭐⭐

跨节点

节点A:生成 UUID
节点B:生成 UUID
节点C:生成 UUID

无需协调,绝对唯一

跨机房

机房A:生成 UUID
机房B:生成 UUID
机房C:生成 UUID

机房故障不影响

缺点

1. 完全无序 ⭐⭐⭐⭐⭐

问题

f47ac10b-58cc-4372-a716-0e02b2c3d479
550e8400-e29b-41d4-a716-446655440000
6ba7b810-9dad-11d1-80b4-00c04fd430c8

完全随机,无序

影响

数据库性能

有序 ID:
- B+ 树索引性能好
- 插入快:50,000 TPS
- 范围查询快

无序 ID:
- B+ 树频繁页分裂
- 插入慢:10,000 TPS
- 范围查询慢

分页查询

数据设计要点

  • 查询目标是快速定位状态、任务或资源,避免在关键路径上做大范围扫描。

2. 存储空间大 ⭐⭐⭐⭐

存储成本

UUID

长度:36 字符
存储:VARCHAR(36)
索引:需要额外空间

雪花算法

长度:19 位数字
存储:BIGINT(20)
索引:节省空间

存储对比

每表 1000 万条数据:

UUID 存储:360 MB
雪花算法存储:80 MB
节省:77%

3. 可读性差 ⭐⭐⭐

用户不可读

订单号:f47ac10b-58cc-4372-a716-0e02b2c3d479
用户:完全看不懂,记不住

不友好

  • ❌ 无法口头传达
  • ❌ 无法记住
  • ❌ 无法手工输入

4. 信息泄露 ⭐⭐⭐

MAC 地址泄露(UUID v1):

UUID 包含 MAC 地址:
550e8400-e29b-41d4-a716-446655440000

                        MAC 地址

风险

  • 暴露机器信息
  • 隐私安全问题
  • 可被追踪

5. 不是时间有序 ⭐⭐⭐⭐

无法排序

用户 A:2024-01-01 注册
用户 B:2024-06-01 注册

UUID:B 的 ID < A 的 ID
无法按 ID 排序用户

影响

  • 无法按 ID 排序
  • 无法按 ID 范围查询
  • 不利于数据分析

性能对比

数据库插入性能

方案QPS延迟索引效率
UUID10,00010ms
雪花算法50,0002ms
数据库自增50,0002ms最好

ID 生成性能

方案QPS延迟CPU
UUID1,000,0000.001ms80%
雪花算法500,0000.01ms30%
数据库自增50,0005ms20%

适用场景

✅ 适合使用 UUID 的场景

1. 消息追踪 ID

- 需要全局唯一
- 有序性不重要
- 生成速度要求高

2. 会话 ID

- 需要随机性
- 安全性重要
- 无序性可接受

3. 日志追踪 ID

- 需要唯一
- 无需排序
- 生成速度快

4. 临时文件 ID

- 临时使用
- 无需持久化
- 唯一即可

5. 数据库外键

- 非主键场景
- 无序性不影响
- 简单易用

❌ 不适合使用 UUID 的场景

1. 订单号

- 需要可读
- 需要有序
- 需要短小

2. 用户 ID

- 需要有序
- 需要短小
- 便于查询

3. 支付流水号

- 需要可追溯
- 需要有序
- 需要安全

4. 商品 ID

- 需要有序
- 便于索引
- 便于查询

改进方向

1. 使用 UUID v7

特点

- 时间有序
- 仍然唯一
- 标准化

2. 使用 ULID

特点

- 时间有序
- 更短(26字符)
- URL 安全

3. 混合方案

方案

UUID + 时间戳排序:
1. 使用 UUID 保证唯一
2. 使用时间戳排序
3. 定期优化索引

结论

UUID 是一把双刃剑

优势

  • ✅ 简单易用
  • ✅ 完全唯一
  • ✅ 无需协调
  • ✅ 性能优秀

劣势

  • ❌ 完全无序
  • ❌ 存储空间大
  • ❌ 数据库性能差

使用建议

推荐使用

  • 消息追踪
  • 会话管理
  • 日志系统

不推荐使用

  • 订单系统
  • 用户系统
  • 支付系统

下一步

了解了 UUID 的优缺点后,我们学习它的适用场景。

👉 下一节:使用场景