593 字
3 分钟
InnoDB 主键应该如何设计
  1. 1MySQL 面试复习导读:知识地图与阅读路线
  2. 2MySQL 存储引擎怎么选:InnoDB、MyISAM 与 MEMORY
  3. 3MySQL 索引类型与 B+ 树:结构、分类和失效场景
  4. 4MySQL B+ 树查询全过程:从根节点到页目录
  5. 5InnoDB 聚簇索引与二级索引:什么是回表
  6. 6MySQL 覆盖索引:如何避免回表
  7. 7MySQL 联合索引的最左前缀匹配原则
  8. 8MySQL 索引下推:把过滤提前到存储引擎
  9. 9MySQL 事务异常读:脏读、不可重复读与幻读
  10. 10MySQL 四种事务隔离级别与选型取舍
  11. 11MySQL MVCC:Undo Log、版本链与 ReadView
  12. 12MySQL InnoDB 锁的分类:行锁、表锁与意向锁
  13. 13MySQL 乐观锁与悲观锁:冲突少时重试,冲突多时排队
  14. 14MySQL 发生死锁怎么办:检测、定位与处理
  15. 15MySQL 事务的 ACID 特性分别是什么
  16. 16InnoDB Redo Log 如何保证崩溃恢复
  17. 17InnoDB Undo Log 的回滚与 MVCC 作用
  18. 18MySQL Binlog 是什么,和 Redo Log 有什么区别
  19. 19一条 MySQL 查询从连接到返回结果经历什么
  20. 20如何用 EXPLAIN 读懂 MySQL 执行计划
  21. 21MySQL 为什么需要 Redo Log 与 Binlog 两阶段提交
  22. 22MySQL 崩溃后如何恢复已提交事务
  23. 23InnoDB Buffer Pool 如何提升查询与写入性能
  24. 24联合索引应该如何设计
  25. 25InnoDB 快照读与当前读如何处理幻读
  26. 26联合索引范围条件之后的列还能使用吗
  27. 27MySQL 索引看起来失效了,如何判断优化器的选择
  28. 28MySQL 8.0 如何定位并处理 InnoDB 死锁
  29. 29MySQL 慢查询如何定位和优化
  30. 30MySQL 的 ORDER BY、GROUP BY 与 filesort
  31. 31MySQL 普通索引和唯一索引如何选择
  32. 32MySQL 主从复制的基本流程是什么
  33. 33MySQL 主从延迟和读写分离如何处理
  34. 34MySQL 深分页为什么慢,如何改写
  35. 35InnoDB 主键应该如何设计本文
  36. 36MySQL 字符集与排序规则有什么区别
  37. 37数据库范式与反范式如何取舍

InnoDB 表按聚簇索引组织,主键选择会影响数据组织和所有二级索引。二级索引叶子记录包含主键值,查询非覆盖字段时再按主键回表。因此主键应稳定、尽量短、非空且不随业务变化;过宽主键会放大每个二级索引的存储和缓存成本。表没有显式主键时,InnoDB 会选择合适的非空唯一索引作为聚簇索引;若没有,则生成隐藏行 ID。

自增整数主键通常插入位置集中在 B+ 树末端,具有较好的局部性,减少随机页分裂;但高并发写入末端页可能形成热点,且分布式多库场景需要全局 ID 方案。随机 UUID 便于生成和跨系统合并,但宽且随机,可能增加索引体积、页分裂和缓存压力。可用有序 UUID 或雪花类 ID,但要评估排序、时钟、唯一性和版本策略,不能只依据名称决定。

主键不是业务展示字段。业务号可能改变、暴露规则或过宽,通常另设唯一业务索引。主键变更代价高,建表前应考虑二级索引数量及未来数据规模。

例如用户表若用邮箱做主键,邮箱变更会牵动聚簇记录定位和相关二级索引,且邮箱字符串会被复制到二级索引条目中。更稳妥的常见设计是短整型或紧凑生成 ID 做主键,再对邮箱建立唯一约束。若需要在多个节点独立生成 ID,应评估时间回拨、节点号分配、排序局部性和冲突处理,并把幂等和唯一键冲突作为应用逻辑的一部分。

追问#

  1. 为什么推荐自增主键? 对常见单库写入,它短且递增,插入局部性较好;这不是所有分布式场景的唯一答案。
  2. UUID 一定导致随机写吗? 纯随机 UUID 通常如此;有序生成方案可以改善局部性,但有自身生成和兼容边界。
  3. 二级索引为什么受主键长度影响? 叶子条目要保存主键值作为定位聚簇记录的信息,主键越宽,二级索引往往越大。
InnoDB 主键应该如何设计
https://blog.xqcherry.top/posts/interview/mysql/primary-key-design/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0