首頁  >  文章  >  資料庫  >  你知道MySQL innodb自增ID BUG有多大影響嗎?

你知道MySQL innodb自增ID BUG有多大影響嗎?

藏色散人
藏色散人轉載
2022-10-18 16:46:032032瀏覽

這些年的 MySQL 都白用了。 。 。你知道MySQL innodb 自增ID BUG 影響現有 99% 的系統嗎。 。 。

你知道MySQL innodb自增ID BUG有多大影響嗎?

首先我們來複現這個神奇的問題:

建立一個測試表,有個自增ID,然後插入3 條數據,刪除 id = 3 的那條。

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
 
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
delete from test where id = 3;

然後,我們重新啟動 MySQL 服務。

再來插入一筆記錄,看一下最後插入ID。 。 。

insert into test values ();
select LAST_INSERT_ID();
select * from test;

結果就是,重啟後,再插入記錄,ID依然還是3! ! !

原來 innodb 的自增ID,會在服務重新啟動後,自動設定為記錄中最大ID 1。

這個問題,只要是做物理刪除的系統裡,100%可以復現。

假設某個表的自增ID,也會和其它記錄相關聯。

極端情況下,重新啟動服務前刪除了最大ID的記錄,服務恢復後插入記錄再去關聯。 。 。

資料混亂問題不敢想像!

好在,這個問題在 MySQL 8.0 已經修復!

如果你是 MySQL 5.7 或更舊的版本用戶,不用擔心,多種解決方案如下:

* 系統中的實體刪除,全部改為軟刪除。一般框架內建此功能,修改重構很方便。

* 啟用 innodb_autoinc_persistent 設置,效能有 1% 損耗,可以忽略不計。

innodb_autoinc_persistent=on
innodb_autoinc_persistent_interval=1

    推薦學習:《MySQL影片教學

以上是你知道MySQL innodb自增ID BUG有多大影響嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yurunsoft.com。如有侵權,請聯絡admin@php.cn刪除