一:自增主鍵是連續的麼?spa
- 自增主鍵不能保證連續遞增。 code
二:自增值保存在哪裏?blog
- 當使用 show create table `table_name`;時,會看到 自增值,也就是 AUTO_INCREMENT。事務
CREATE TABLE `t` ( .... ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
- 這個輸出結果容易引發這樣的誤解:自增值是保存在表結構定義裏的。內存
- 實際上,表的結構定義存放在後綴名爲.frm 的文件中,可是並不會保存自增值。table
三:不一樣的引擎對於自增值的保存策略不一樣。class
- MyISAM 引擎數據
- 自增值保存在數據文件中。tab
- InnoDB 引擎di
- 保存在了內存裏,而且到了 MySQL 8.0 版本後,纔有了「自增值持久化」的能力,也就是才實現了「若是發生重啓,表的自增值能夠恢復爲 MySQL 重啓前的值」。
- 過程
- 在 MySQL 5.7 及以前的版本,自增值保存在內存裏,並無持久化。
- 每次重啓後,第一次打開表的時候,都會去找自增值的最大值 max(id),而後將 max(id)+1 做爲這個表當前的自增值。
- 舉例來講,若是一個表當前數據行裏最大的 id 是 10,AUTO_INCREMENT=11。
- 這時候,咱們刪除 id=10 的行,AUTO_INCREMENT 仍是 11。
- 但若是立刻重啓實例,重啓後這個表的 AUTO_INCREMENT 就會變成 10。
- 在 MySQL 8.0 版本,將自增值的變動記錄在了 redo log 中,重啓的時候依靠 redo log 恢復重啓以前的值。
四:什麼狀況會致使自增ID不連續?
- 惟一鍵衝突
- 執行器對自增鍵+1,可是 innoDB 發現惟一鍵衝突,致使的不連續。
- 事務回滾
- 事務添加自增鍵+1,可是因爲回滾數據,數據被清除,致使的不連續。