這些年的 MySQL 都白用了。 。 。你知道MySQL innodb 自增ID BUG 影響現有 99% 的系統嗎。 。 。
首先我們來複現這個神奇的問題:
建立一個測試表,有個自增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中文網其他相關文章!