温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据库主键如何设计

发布时间:2026-10-14 07:07:55 来源:亿速云 阅读:108 作者:小樊 栏目:数据库

数据库主键(Primary Key)的设计直接关系到数据的唯一性、查询性能、可扩展性以及业务灵活性。下面从原则、常见方案、对比与最佳实践几个层面系统说明。


一、主键设计的核心原则

  1. 唯一且非空
    • 主键值必须唯一标识一行,且不能为 NULL。
  2. 稳定不变
    • 主键不应随业务变化而修改(如手机号、邮箱不适合做主键)。
  3. 尽量短小
    • 主键会进入所有索引和关联表中,越短越省空间、越快。
  4. 有序性利于写入(视场景)
    • 自增或时间序列主键在 InnoDB 等引擎中可减少页分裂。

二、常见主键设计方案

1. 自增主键(AUTO_INCREMENT)

id BIGINT AUTO_INCREMENT PRIMARY KEY

优点

  • 简单、性能好
  • 插入顺序化,减少索引碎片

缺点

  • 分库分表时不安全(易冲突)
  • 暴露业务规模(可通过 ID 猜数量)
  • 不适合分布式系统

适用场景

  • 单体系统
  • 内部系统
  • 不需要对外暴露 ID

2. UUID(无序全局唯一)

id CHAR(36) PRIMARY KEY

优点

  • 全局唯一
  • 适合分布式、微服务

缺点

  • 无序,写入性能差
  • 占用空间大(36 字节)
  • 索引效率低

优化方案

  • 使用 BINARY(16) 存储 UUID
  • 使用 UUIDv7(时间有序)

3. 雪花算法(Snowflake ID)

时间戳 + 机器ID + 序列号

优点

  • 分布式唯一
  • 趋势递增
  • 性能好(通常为 BIGINT)

缺点

  • 依赖时钟(时钟回拨问题)
  • 实现稍复杂

适用场景

  • 高并发
  • 微服务
  • 分库分表

4. 业务主键(自然主键)

PRIMARY KEY (order_no)

优点

  • 语义清晰

缺点

  • 易变(订单号规则可能改)
  • 长度大、性能差

建议

  • 业务字段做 唯一索引
  • 技术主键做 主键

5. 联合主键

PRIMARY KEY (user_id, role_id)

优点

  • 适合多对多关系表

缺点

  • 不利于扩展
  • 关联表复杂

建议

  • 关系表可用联合主键
  • 核心表仍建议单一主键

三、不同场景的主键建议

场景 推荐方案
单体应用 自增 BIGINT
微服务 Snowflake / UUIDv7
分库分表 Snowflake
日志表 时间 + 自增
关系表 联合主键或代理主键
对外 API 不暴露自增 ID

四、最佳实践总结

✅ 推荐组合方案

BIGINT 主键(Snowflake)
业务字段加 UNIQUE

✅ 不要

  • 用手机号、身份证做主键
  • 用 UUID 做 InnoDB 主键(无序)
  • 随意修改主键

✅ 对外安全

  • 对外使用 order_no、code
  • 对内使用 id

如果你愿意,我可以根据你的:

  • 数据库类型(MySQL / PostgreSQL / Oracle)
  • 是否分库分表
  • 并发量

给你一套具体可落地的主键设计方案。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手