自增主键去哪了?---一次开发过程中的思考
💡
原文中文,约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不连续,这种情况一般发生在表的设计初期。
➡️