首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL AUTO_INCREMENT 重啟後的行為差異:MyISAM vs InnoDB 經典面試題深度解析

     編輯:MySQL 資料庫相關知識

經典面試題:表有自增主鍵,插入 17 條後刪除 15/16/17,重啟 MySQL 再插入一條,新 ID 是 18 還是 15?

答案取決於儲存引擎:

  • MyISAM → 18:最大 ID 持久化到 .MYD 資料文件,重啟不丟失。
  • InnoDB → 15:最大 ID 僅駐留在記憶體,重啟或 OPTIMIZE TABLE 會重置為「當前最大值 + 1」。

實戰驗證:InnoDB 表重啟後 ID 回退

-- 初始狀態: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。

獲取最後插入 ID:LAST_INSERT_ID()

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0                |  -- 當前會話無插入操作時為 0
+------------------+

該函數返回當前會話最後一次成功插入的自增值,不受並發會話影響,是獲取新增記錄 ID 的標準方式。

深度原理與避坑指南

特性MyISAMInnoDB
計數器持久化.MYD 文件僅記憶體(8.0+ 可配置持久化)
重啟後行為保持最大值+1重置為 MAX(id)+1
TRUNCATE TABLE重置為 1重置為 1
DELETE 全表保持最大值+1保持最大值+1 (5.7+)
業務風險低ID 重複/外鍵關聯錯亂

最佳實踐建議

  1. 業務主鍵勿依賴自增 ID 的連續性——允許空洞、允許重啟回退。
  2. 分散式系統請用 UUID、Snowflake ID 或分段號段模式,避免自增衝突。
  3. InnoDB 8.0+ 可開啟 innodb_autoinc_persistent=ON 持久化計數器(需評估效能影響)。
  4. 測試環境重啟後預期 ID 可能變小,勿以測試數據驗證生產邏輯。

理解引擎層面的差異,才能在架構設計與故障排查中做出正確判斷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved