1. 自增 ID
- 定义:数据库中自动生成的递增数值(如 MySQL 的
AUTO_INCREMENT
),依赖数据库自身特性。 - 优点:占用空间小,检索速度快。在数据量小的系统中通常一个int(8)即可满足使用要求。
- 缺点:
- 分布式唯一性问题:多个数据库实例无法保证全局唯一。
- 扩展性差:分库分表时需复杂策略(如设置不同起始值)。
- 依赖数据库:强依赖数据库可用性,无法在离线场景使用。
- 每次获取最新主键ID都需要一次额外的数据库查询操作,高并发场景每多一次操作都是性能的浪费。存在信息泄露的问题,主键id可能关联很多表,前端url中存在短数字串容易被猜到是主键id,也容易被推测出数据量,比如新注册的用户,通过报文得知id编号推测出整个系统的用户量。
2. 雪花 ID(Snowflake ID)
- 定义:Twitter 开源的分布式 ID 生成算法,由 64 位二进制组成,包含时间戳、数据中心 ID、机器 ID 和序列号。
- 优势:数字类型,顺序增加,不会重复,占用空间相比UUID更小。兼顾检索速度和分布式不会冲突的特点。
- 劣势:存储内容较长、前端 Long 转换有精度丢失问题(需要实现 Json 转换解决精度问题)、服务器时钟回拨问题导致重复 ID (概率较低)、插入性能没有自增 ID 好
3. UUID(通用唯一标识符)
- 定义:由 128 位二进制组成的字符串(通常以 36 字符表示),遵循 RFC 4122 标准。
- 优点:
- 全网唯一、适合分布式分库分表存储、ID 没有规律不会被恶意猜测
- 缺点:
- 占用空间大,不论数据量大小占用容量都是varchar(36)以上。因为UUID是随机数值,在批量查找数据时,数据的分布可能是随机的,会造成很高的磁盘随机读取消耗而降低效率,当然也可以选择使用顺序UUID。UUID包含MAC地址,存在隐私泄露风险。
- 关于 UUID 还有一种有序 UUID,有序 UUID 会有更好的性能,Hibernate 依赖包中有关于有序 UUID 的实现类:org.hibernate.id.UUIDHexGenerator。
-
特性 自增 ID 雪花 ID UUID 全局唯一性 仅数据库内唯一 全局唯一 全局唯一 性能 高(依赖数据库) 极高(本地生成) 较高(本地生成) 有序性 递增有序 时间戳有序 无序 存储成本 低(整数) 低(64 位长整数) 高(字符串) 复杂度 简单 需配置数据中心 / 机器 无依赖 典型场景 单体数据库 分布式系统 通用唯一标识
占用空间:自增 < 雪花 < UUID
检索效率:自增 < 雪花 < UUID
伸缩性:自增不支持,雪花、UUID支持。