ID 的生成一般可以是序列递增、雪花算法、UUID 等等
1️⃣序列自增
✅ 优点:
- 占用空间小:自增 ID 通常使用较小的数据类型(如 INT),占用存储空间较小。
- 性能好:自增 ID 是顺序生成的,可以连续存储在磁盘上,有利于提高插入操作的性能,减少碎片化。
- 易于排序和索引:自增 ID 可以快速排序和索引,有利于提高查询效率。
❌ 缺点:
- 局部唯一性:在单数据库实例中是唯一的,但在分布式系统中或在多个数据库之间使用时需要额外的机制来确保全局唯一性(例如使用 UUID 或其他分布式 ID 生成策略)。
- 需要数据库级别的唯一性检查:每次插入前需要检查是否已存在相同的 ID,这会增加数据库的负担。
- 重用问题:如果在删除记录后不重新使用 ID,会导致 ID 的浪费。虽然可以通过一些策略(如预留 ID 池)解决,但这增加了实现的复杂性。
2️⃣❄️雪花算法
雪花算法(Snowflake Algorithm)是由 Twitter 设计并开源的一种分布式唯一 ID 生成算法,用于在高并发、分布式环境下高效生成全局唯一、时间有序的 64 位整数 ID(Long 类型)。其核心思想是将一个 64 位二进制数划分为多个功能段,通过'时间戳 + 机器标识 + 序列号'组合生成 ID。
64 位雪花 ID 位分配图解(标准版)
0 41 51 63 ┌────────────┬─────────┬───────────┐ │ timestamp │ dataCtr │ worker │ sequence │ (41 bits) │ (5 bits)│ (5 bits) │ (12 bits) └────────────┴─────────┴───────────┘ ↑ 64-bit signed long (最高位为符号位,始终为 0 → 实际可用 63 位)
| 字段 | 长度 | 取值范围 | 说明 |
|---|---|---|---|
timestamp | 41 位 | 0 ~ 2⁴¹−1 ms ≈ 69.7 年 | 自 EPOCH 起的毫秒差;决定 ID 时间序和生命周期 |
datacenterId | 5 位 | 0 ~ 31 | 标识数据中心(如:北京=1、上海=2) |
workerId | 5 位 | 0 ~ 31 | 标识该中心内的具体机器(进程) |
sequence | 12 位 | 0 ~ 4095 | 同一毫秒内自增序号;支持单机峰值 4096 ID/ms |

