字節面試:MySQL自增ID用完會怎樣?

磊哥課程 2024-06-15 06:58:44

在一些中小型項目開發中,我們通常會使用自增 ID 來作爲主鍵的生成策略,但隨著時間的推移,數據庫的信息也會越來越多,尤其是使用自增 ID 作爲日志表的主鍵生成策略時,可能很快就會遇到 ID 被用完的情況,那麽如果發生了這種情況,MySQL 又會怎樣執行呢?

PS:當然,在分庫分表的場景中,我們通常會使用雪花算法來替代自增 ID,但中小型項目開發中,使用自增 ID 的場景還是比較多的。

1.自增ID

在 MySQL 中,如果字段的數據類型爲整數類型(如 INT、BIGINT 等),則可以通過關鍵字“AUTO_INCREMENT”來設置讓當前的字段實現自增,例如以下 SQL:

CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(128));1.1 優點分析

自增 ID 的優點如下:

簡單方便,能自動爲每行數據分配唯一的標識。對于按順序插入的數據,能很好地反映數據插入的先後順序。1.2 缺點分析

自增 ID 的缺點如下:

在數據進行遷移或分庫分表時,可能會出現問題,需要特殊處理。如果數據量非常大,可能會達到自增 ID 的上限。存在安全性問題,比如通過自增 ID 可能會推測出一些業務信息。例如,一個電商訂單表使用自增 ID 作爲主鍵,可能會被競爭對手通過訂單號大致推測出業務量等信息。2.自增ID用完會怎樣?

自增 ID 分爲以下兩種情況:

一種是主鍵自增 ID 用完後的情況,另一種是 InnoDB 引擎中未設置主鍵時使用 row_id 用完後的場景,它們的情況是不一樣的,所以我們分開來聊。

2.1 主鍵自增ID用完

當主鍵自增 ID 達到上限後,再新增下一條數據時,它的 ID 不會變(還是最大的值),只是此時再添加數據時,因爲主鍵約束的原因,ID 是不允許重複的,所以就會報錯提示主鍵沖突。

我們可以使用以下 SQL 來測試:

CREATE TABLE t ( id INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(128)) auto_increment=2147483647;insert into t(id,`name`) values(null,'javacn.site');select * from t;insert into t(id,`name`) values(null,'www.javacn.site');

以上 SQL 是創建了一個表 t,並且給 t 表的主鍵 id 設置自增 ID,之後再將表的自增 ID 初始化爲 INT(有符號)的最大值 2147483647,然後再添加兩條數據。

以上 SQL 的執行結果如下:

從上面的執行結果可以看出:當主鍵自增 ID 達到上限後,再新增下一條數據時,它的 ID 不會變(還是最大的值),只是此時再添加數據時,因爲主鍵約束的原因,ID 是不允許重複的,所以就會報錯提示主鍵沖突。

2.2 row_id用完

如果表沒有設置主鍵,InnoDB 會自動創建一個全局隱藏的 row_id,其長度爲 6 個字節,當 row_id 達到上限後,它的執行流程和主鍵 ID 不同,它是再次歸零,然後重新遞增,如果出現相同的 row_id,後面的數據會覆蓋之前的數據。

課後思考

如何驗證 row_id 用完後歸零覆蓋原數據的情況?

本文已收錄到我的面試小站 [www.javacn.site](https://www.javacn.site),其中包含的內容有:Redis、JVM、並發、並發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。

0 阅读:46

磊哥課程

簡介:感謝大家的關注