《Mysql - 自增主鍵爲什麼不是連續的?》

一:自增主鍵是連續的麼?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,可是因爲回滾數據,數據被清除,致使的不連續。

相關文章
相關標籤/搜索