易君召
发布于 2026-08-17 / 作者:易君召 / 6 阅读
0

UUID vs 自增 ID(自增主键)适用场景对比

  • UUIDv7:128bit,时间有序 UUID,可应用端 / 数据库生成,MySQL 推荐存储为 BINARY(16),不建议存 varchar (36) 字符串

  • 自增 ID:数据库 AUTO_INCREMENT,BIGINT,数据库端生成

基础特性

特性

自增 ID(AUTO_INCREMENT/BIGINT)

UUID

存储

bigint 8 字节,占用小

标准 UUID 16 字节,占用大;字符串 36 字节更大

值特征

连续递增,数字,有序

随机 / 半随机,128 位,全局唯一,无序

数据库索引

索引紧凑,B + 树页填充率高,写入性能好

无序 UUID 会造成索引页随机分裂,插入性能差;UUIDv7 有序可改善

可读性

简单数字,便于调试、看日志

字符串,不易肉眼分辨

业务暴露

ID 可被推测,可遍历、猜总量

很难被猜测,防遍历

多库合并

分库分表容易 ID 冲突,需要 ID 生成器

天然全局唯一,多库合并无冲突

生成位置

数据库内部生成

数据库生成 / 应用端生成

自增 ID 适用场景 ✅

  1. 单库单表,绝大多数普通业务表

    如用户表、订单表、商品表,单实例 MySQL,追求数据库写入性能、索引效率。

  2. 不需要对外暴露 ID,仅内部主键

    ID 只在程序内部关联,API 对外返回业务编码,不直接返回主键 ID。

  3. 追求小存储、高性能,表数据量大

    bigint 占 8 字节,关联其他表作为外键时,索引体积小,join 更快。

  4. 不需要跨库、多实例数据合并

    不做跨库迁移、多库数据合并。

  5. 需要简单人工排查、日志查看

    日志、调试时数字 ID 直观。

⚠️缺点:

  • 对外暴露容易被爬虫遍历(/user/1001/user/1002);

  • 分库分表多实例直接用自增会 ID 冲突,必须搭配雪花算法、号段模式等 ID 生成器;

  • 数据库故障恢复,自增序列会跳号。

自增 ID ❌不适合

  • 多库独立写入,后续要合并数据;

  • 主键直接对外 API 返回,不想被猜测业务规模;

  • 应用离线先构造实体,还未插入数据库就要拿到主键 ID。

UUID 适用场景 ✅

注意:优先选择 UUID v7(时间有序 UUID),不要用 v4 完全随机 UUID,v4 插入 MySQL 会严重影响 InnoDB 性能。

  1. 应用层提前生成 ID

    还没插入数据库,业务代码就需要拿到主键 ID;分布式服务,不需要访问 DB 就生成唯一键。

  2. 多库、多实例、分库分表、数据合并

    多个独立数据库写入,后续需要合并数据,不会主键冲突。

  3. 主键直接对外暴露,防止遍历、猜业务量级

    API 直接返回主键,不想对手通过 ID 猜出用户量、订单量。

  4. 离线数据导入、异构系统对接

    外部系统导入数据,自带唯一标识。

  5. 没有中心化 ID 发号服务的分布式环境

⚠️缺点:

  • v4 完全随机:InnoDB 主键索引随机插入,大量页分裂,插入性能暴跌;

  • 存储开销大,外键索引体积膨胀;

  • 可读性差,日志排查不方便;

  • 默认字符串形式占用更大,建议存二进制 (16 字节) 而不是 36 位字符串。

UUID ❌不适合

  1. 超高写入 QPS,且使用 UUID v4(无序)作为 InnoDB 主键;

  2. 表数量极大,大量外键关联,希望尽可能压缩存储;

  3. 数据库性能资源紧张,没有使用有序版本 UUID (v7)。

常见误区

  1. ❌ 分布式就必须用 UUID

分布式更多用雪花算法、号段 ID 生成器,64 位 long,兼顾有序、全局唯一,存储小,比 UUID 更适合 MySQL。UUID 只是其中一个选项,不是最优。

  1. ❌ UUID 全部性能很差

UUID v7 是时间有序 UUID,128bit,保留全局唯一,同时插入 InnoDB 是有序,解决 v4 随机写的痛点,适合分布式。

  1. ❌ 自增 ID 不能用于分布式

MySQL 原生自增多库会冲突;但可以设置不同自增步长,或者业务层引入 ID 生成器,依然可以使用数字 ID。

选型决策建议

  1. 单库业务,内部主键,不对外暴露 → BIGINT 自增 ID(首选)

  2. 多库合并、应用层预生成 ID、对外暴露主键 → UUID v7

  3. 分布式高并发,追求数字 ID,存储小 → 雪花算法 / 号段模式(64 位 long)

  4. 尽量避免:UUID v4 直接当 InnoDB 主键

对外接口小技巧

无论内部主键是自增 ID 还是 UUID,最佳实践:内部主键和对外业务 ID 分离。数据库用自增 / 雪花做主键,对外 API 返回单独的业务编码,兼顾性能和安全。


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/uuid-vs-auto-increment-id-use-case-comparison

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/