經典面試題:表有自增主鍵,插入 17 條後刪除 15/16/17,重啟 MySQL 再插入一條,新 ID 是 18 還是 15?
答案取決於儲存引擎:
.MYD 資料文件,重啟不丟失。OPTIMIZE TABLE 會重置為「當前最大值 + 1」。-- 初始狀態:11 條記錄,AUTO_INCREMENT=12
mysql> SHOW CREATE TABLE test1\G
... ENGINE=InnoDB AUTO_INCREMENT=12 ...
-- 刪除 ID 9,10,11
mysql> DELETE FROM test1 WHERE id IN (9,10,11);
-- 重啟 MySQL
[root@fsailing1 ~]# service mysqld restart
-- 重啟後 AUTO_INCREMENT 變為 9(當前最大 ID 8 + 1)
mysql> SHOW CREATE TABLE test1\G
... ENGINE=InnoDB AUTO_INCREMENT=9 ...
新插入記錄的 ID 將從 9 開始,而非 12。
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0 | -- 當前會話無插入操作時為 0
+------------------+
該函數返回當前會話最後一次成功插入的自增值,不受並發會話影響,是獲取新增記錄 ID 的標準方式。
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 計數器持久化 | .MYD 文件 | 僅記憶體(8.0+ 可配置持久化) |
| 重啟後行為 | 保持最大值+1 | 重置為 MAX(id)+1 |
| TRUNCATE TABLE | 重置為 1 | 重置為 1 |
| DELETE 全表 | 保持最大值+1 | 保持最大值+1 (5.7+) |
| 業務風險 | 低 | ID 重複/外鍵關聯錯亂 |
innodb_autoinc_persistent=ON 持久化計數器(需評估效能影響)。理解引擎層面的差異,才能在架構設計與故障排查中做出正確判斷。