自增主键去哪了?---一次开发过程中的思考

💡 原文中文,约4400字,阅读约需11分钟。
📝

内容提要

文章讨论了MySQL中自增主键的生成及其不连续性问题。创建唯一索引后,插入相同业务ID和类型会导致错误,主键可能不连续。不同引擎的自增主键生成机制不同,InnoDB在5.7之前将自增值保存在内存中,8.0后记录在redo log中。事务回滚和批量插入也可能导致主键丢失和不连续。

🎯

关键要点

  • 文章讨论了MySQL中自增主键的生成及其不连续性问题。
  • 创建唯一索引后,插入相同业务ID和类型会导致错误,主键可能不连续。
  • 不同引擎的自增主键生成机制不同,MyISAM引擎的自增值保存在数据文件中。
  • InnoDB在5.7之前将自增值保存在内存中,8.0后记录在redo log中。
  • 事务回滚和批量插入也可能导致主键丢失和不连续。
  • 自增主键的生成可以依赖数据库,插入时主键设置为null或不设置。
  • 自增主键不连续的情况包括手动指定ID和唯一索引冲突导致的插入失败。
  • 事务回滚会导致主键丢失,因为一旦分配了主键就不会回滚。
  • 批量插入时,主键ID可能不连续,尤其是使用insert...select语句时。
  • 主键ID设置的步长不为1也会导致不连续的情况。

延伸问答

MySQL中自增主键的生成机制是什么?

MySQL中自增主键的生成机制因引擎而异,MyISAM引擎将自增值保存在数据文件中,而InnoDB引擎在5.7之前将自增值保存在内存中,8.0后记录在redo log中。

为什么在插入数据时自增主键可能不连续?

自增主键不连续可能由于事务回滚、批量插入失败、手动指定ID或唯一索引冲突等原因导致。

如何避免自增主键冲突?

避免自增主键冲突可以通过确保插入的数据不违反唯一索引约束,或在插入时不手动指定ID来实现。

事务回滚对自增主键有什么影响?

事务回滚会导致已经分配的自增主键丢失,因为一旦分配了主键就不会回滚。

批量插入时自增主键的分配策略是什么?

批量插入时,自增主键的分配策略是每次申请自增ID时,分配的数量会逐渐增加,第一次分配1个,第二次分配2个,第三次分配4个,以此类推。

自增主键的步长设置会影响什么?

自增主键的步长设置不为1会导致主键ID不连续,这种情况一般发生在表的设计初期。

➡️

继续阅读