标准答案
- 自增整数短小、索引友好、写入局部性好,适合单库或由数据库统一分配 ID 的场景。
- 随机 UUID 可在应用侧离线生成,适合多节点写入,但作为聚簇键会增加页分裂和二级索引体积;可考虑有序 UUID 版本或独立内部键。
- 雪花类 ID 可分布式生成且大致有序,但要处理时钟回拨、节点标识、容量和数据泄露的可预测性。
- 业务订单号需要可读、可校验或带业务语义时应作为独立唯一字段,不应让规则变化牵动主键和外键。
- 对外暴露 ID 时还要考虑枚举攻击、授权校验和日志可读性,而不是只看生成速度。
题目解析
在以聚簇索引组织数据的引擎中,主键越长、越随机,主数据和所有二级索引的成本越高。因为二级索引叶子通常会存主键值,使用 36 字节字符串 UUID 会放大存储、缓存和 I/O。
ID 的选型必须与部署模式匹配。只因“以后可能分库”就引入复杂全局 ID 生成器未必值得;反过来,已存在多地域独立写入时再依赖单点自增也会成为可用性和迁移瓶颈。
常见误区
- 把手机号、邮箱或订单展示号直接作为主键,业务规则或隐私要求变化时无法迁移。
- 只讨论 UUID 是否会冲突,却忽略其索引宽度、排序特性和对二级索引的放大。