这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
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 QPS4. 标准化 ⭐⭐⭐⭐
标准化程度:
- 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 | 延迟 | 索引效率 |
|---|---|---|---|
| UUID | 10,000 | 10ms | 差 |
| 雪花算法 | 50,000 | 2ms | 好 |
| 数据库自增 | 50,000 | 2ms | 最好 |
ID 生成性能
| 方案 | QPS | 延迟 | CPU |
|---|---|---|---|
| UUID | 1,000,000 | 0.001ms | 80% |
| 雪花算法 | 500,000 | 0.01ms | 30% |
| 数据库自增 | 50,000 | 5ms | 20% |
适用场景
✅ 适合使用 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 的优缺点后,我们学习它的适用场景。
👉 下一节:使用场景