type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Dec 30, 2025 03:17 AM
这里只记录 innodb 引擎的实现逻辑
MySQL ≤ 5.7
自增值保存在内存中,在第一次打开表时,会找到 max(id),会将 max(id) + 1 作为这个表当前的自增值。所以,如果 mysql 重启,可能会导致自增值变化。举例 table x id 如下,当前最大 id 为10,如果立马删除 id = 10 的数据,然后重启 mysql 实例,重启后,table x 的自增值会重新变为10(max(id) + 1 = 9 + 1)。
table x
id |
1 |
2 |
… |
9 |
10 |
MySQL ≥ 8.0
自增值会在 redo log 中持久化,mysql 重启后会从 redo log 中恢复自增值
MySQL 主键自增值修改机制
id_increament_test
初始情况- 插入时,id = 0 或者 nul,主键id会按照当前自增值来赋值
- 假设当前自增值为 Y,插入时,如果指定了id值 X(X ≠ 0,并且 X值不与数据库中的任何值冲突),分为两种情况:
- X < Y,插入数据 id = X,自增值不变
- X ≥ Y,插入数据 id = X,自增值变为 Y = X+(自增步长)