《Mysql 自增主鍵為何不是連續的?》

2022-05-02 08:45:12 字數 1074 閱讀 8332

一:自增主鍵是連續的麼?

- 自增主鍵不能保證連續遞增。 

二:自增值儲存在**?

- 當使用 show create table `table_name`;時,會看到 自增值,也就是 auto_increment。

- 這個輸出結果容易引起這樣的誤解:自增值是儲存在表結構定義裡的。

- 實際上,表的結構定義存放在字尾名為.frm 的檔案中,但是並不會儲存自增值

三:不同的引擎對於自增值的儲存策略不同。

- myisam 引擎

-自增值儲存在資料檔案中

- innodb 引擎

-儲存在了記憶體裡,並且到了 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,但是由於回滾資料,資料被清除,導致的不連續。

為什麼mysql自增主鍵不是連續的

目錄 提出這個問題,是因為在工作中發現 mysql 中的 user 表的 id 預設是自程式設計客棧增的,但是資料庫儲存的結果卻不是連續的。user 表結構 create table user id bigint 20 unsigned not null auto increment comment...

mysql 主鍵自增語句 MySQL 自增主鍵

以下僅考慮 innodb 儲存引擎。自增主鍵有兩個性質需要考慮 單調性每次插入一條資料,其 id 都是比上一條插入的資料的 id 大,就算上一條資料被刪除。連續性插入成功時,其資料的 id 和前一次插入成功時資料的 id 相鄰。自增主鍵的單調性 為何會有單調性的問題?這主要跟自增主鍵最大值的獲取方式...

MySQL設定主鍵自增和非主鍵自增

mysql 每張表只能有1個自動增長字段,這個自動增長字段即可作為主鍵,也可以用作非主鍵使用,但是請注意將自動增長字段當做非主鍵使用時必須必須為其新增唯一索引,否則系統將會報錯。例如 將自動增長字段設定為主鍵 create table t1 id int auto increment primary...