亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL8新特性:自增主鍵的持久化詳解

2024-07-25 19:08:39
字體:
來源:轉載
供稿:網友

前言

自增主鍵沒有持久化是個比較早的bug,這點從其在官方bug網站的id號也可看出(https://bugs.mysql.com/bug.php?id=199)。由Peter Zaitsev(現Percona CEO)于2003年提出。歷史悠久且臭名昭著。

首先,直觀的重現下。

mysql> create table t1(id int auto_increment primary key);Query OK, 0 rows affected (0.01 sec)mysql> insert into t1 values(null),(null),(null);Query OK, 3 rows affected (0.01 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> select * from t1;+----+| id |+----+| 1 || 2 || 3 |+----+rows in set (0.00 sec)mysql> delete from t1 where id=3;Query OK, 1 row affected (0.36 sec)mysql> insert into t1 values(null);Query OK, 1 row affected (0.35 sec)mysql> select * from t1;+----+| id |+----+| 1 || 2 || 4 |+----+rows in set (0.01 sec)

雖然id為3的記錄刪除了,但再次插入null值時,并沒有重用被刪除的3,而是分配了4。

刪除id為4的記錄,重啟數據庫,重新插入一個null值。

mysql> delete from t1 where id=4;# service mysqld restartmysql> insert into t1 values(null);Query OK, 1 row affected (0.00 sec)mysql> select * from t1;+----+| id |+----+| 1 || 2 || 3 |+----+rows in set (0.00 sec)

可以看到,新插入的null值分配的是3,按照重啟前的操作邏輯,此處應該分配5啊。

這就是自增主鍵沒有持久化的bug。究其原因,在于自增主鍵的分配,是由InnoDB數據字典內部一個計數器來決定的,而該計數器只在內存中維護,并不會持久化到磁盤中。當數據庫重啟時,該計數器會通過下面這種方式初始化。

SELECT MAX(ai_col) FROM table_name FOR UPDATE; 

MySQL 8.0的解決思路

將自增主鍵的計數器持久化到redo log中。每次計數器發生改變,都會將其寫入到redo log中。如果數據庫發生重啟,InnoDB會根據redo log中的計數器信息來初始化其內存值。為了盡量減小對系統性能的影響,計數器寫入到redo log中,并不會馬上刷新。具體可參考:https://dev.mysql.com/worklog/task/?id=6204

因自增主鍵沒有持久化而出現問題的常見場景:

1. 業務將自增主鍵作為業務主鍵,同時,業務上又要求主鍵不能重復。

2. 數據會被歸檔。在歸檔的過程中有可能會產生主鍵沖突。

所以,強烈建議不要使用自增主鍵作為業務主鍵。刨除這兩個場景,其實,自增主鍵沒有持久化的問題并不是很大,遠沒有想象中的”臭名昭著“。

最后,給出一個歸檔場景下的解決方案,

創建一個存儲過程,根據table2(歸檔表)自增主鍵的最大值來初始化table1(在線表)。這個存儲過程可放到init_file參數指定的文件中,該文件中的SQL會在數據庫啟動時執行。

DELIMITER ;;CREATE PROCEDURE `auto_increment_fromtable2`(IN table1 VARCHAR(255), IN table2 VARCHAR(255))BEGINset @qry = concat('SELECT @max1 := (`id` + 1) FROM `',table1,'` ORDER BY `id` DESC LIMIT 1;'); prepare stmt from @qry;execute stmt;deallocate prepare stmt; set @qry = concat('SELECT @max2 := (`id` + 1) FROM `',table2,'` ORDER BY `id` DESC LIMIT 1;'); prepare stmt from @qry;execute stmt;deallocate prepare stmt;IF @max1 < @max2 THEN set @qry = concat('alter table `',table1,'` auto_increment=',@max2);prepare stmt from @qry;execute stmt;deallocate prepare stmt;SELECT 'updated' as `status`;elseSELECT 'no update needed' as `status`;END IF;END ;;DELIMITER ;

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情视频在线| 人人做人人澡人人爽欧美| 91亚洲精品一区二区| 亚洲天堂男人天堂| 中文字幕在线亚洲| 亚洲欧美日韩久久久久久| 欧美激情一区二区三区久久久| 久久久久久免费精品| 精品国偷自产在线视频99| 97视频免费在线看| 国产一区二区三区免费视频| 国产精品99导航| 国产精品久久久久久五月尺| 欧美激情区在线播放| 91精品久久久久久久久久久久久久| 亚洲精品小视频在线观看| 亚洲精品狠狠操| 精品国产自在精品国产浪潮| 久久精品国产免费观看| 69国产精品成人在线播放| 日本精品一区二区三区在线播放视频| 国产精品网站入口| 欧美另类极品videosbest最新版本| 日韩在线免费视频观看| 美女啪啪无遮挡免费久久网站| 97成人精品视频在线观看| 日韩精品视频免费专区在线播放| 亚洲人成人99网站| 色偷偷88888欧美精品久久久| 日韩av网站在线| 日韩在线欧美在线国产在线| 久久资源免费视频| 91大神在线播放精品| 欧美黄网免费在线观看| 日韩精品免费在线视频观看| 国产精品久久久精品| 日韩av片免费在线观看| 欧美日韩在线视频一区二区| 青青久久av北条麻妃海外网| 国产视频精品一区二区三区| 午夜精品久久久99热福利| 5566日本婷婷色中文字幕97| 欧美亚洲视频在线观看| 亚洲性生活视频在线观看| 国产亚洲人成a一在线v站| 丁香五六月婷婷久久激情| 久久69精品久久久久久久电影好| 欧美激情一区二区久久久| 欧美一级视频一区二区| 精品一区精品二区| 亚洲精品福利资源站| 丝袜美腿亚洲一区二区| 亚洲欧美日韩图片| 欧美激情视频网站| 中文字幕亚洲欧美日韩2019| 91av国产在线| 国产精品日韩欧美大师| 日韩成人黄色av| 国产欧美日韩专区发布| 国产成人精品视频| 秋霞成人午夜鲁丝一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 欧美日韩一区二区三区| www.99久久热国产日韩欧美.com| 日韩av中文字幕在线| 国产在线播放91| 97视频在线观看网址| 欧美激情一区二区三级高清视频| 91中文字幕在线观看| 亚洲精品国产精品久久清纯直播| 国产一区二区激情| 久久久久久网站| 久久777国产线看观看精品| 欧美午夜电影在线| 57pao成人永久免费视频| 久久久久国产精品免费| xxxxx成人.com| 亚洲色图国产精品| 国产美女精品视频| 中文字幕亚洲二区| 1769国内精品视频在线播放| 国色天香2019中文字幕在线观看| 午夜精品视频网站| 亚洲第一区第二区| 国产精品久久久久久中文字| 97视频人免费观看| 国产精品揄拍一区二区| 精品免费在线观看| 欧美精品免费看| 国产精品电影网站| 97精品国产97久久久久久春色| 久久最新资源网| 亚洲精品欧美极品| 有码中文亚洲精品| 亚洲大胆人体在线| 中文字幕欧美亚洲| 亚洲天堂第一页| 欧美插天视频在线播放| 日韩美女在线观看| 亚洲大胆人体在线| 88国产精品欧美一区二区三区| 亚洲国产三级网| 成人性生交大片免费看小说| 欧美小视频在线观看| 成人欧美在线视频| 中文字幕日韩av电影| 亚洲欧洲一区二区三区在线观看| 国产视频福利一区| 久久久中精品2020中文| 全亚洲最色的网站在线观看| 91精品国产综合久久男男| 久久久久久久久久亚洲| 色悠久久久久综合先锋影音下载| 51精品在线观看| 国产亚洲美女精品久久久| 国产欧美日韩综合精品| 国产精品视频久| 亚洲日本中文字幕免费在线不卡| 精品国产欧美一区二区三区成人| 日本午夜精品理论片a级appf发布| 91精品视频在线播放| 在线观看成人黄色| 日韩一级裸体免费视频| 成人性生交大片免费看视频直播| 91九色综合久久| 亚洲欧美一区二区三区四区| x99av成人免费| 亚洲欧洲国产伦综合| 最新69国产成人精品视频免费| 国产精品av电影| 亚洲精品视频在线观看视频| 欧美精品在线网站| 国产日韩在线看| 日韩av在线免费| 插插插亚洲综合网| 欧美性猛交xxxx偷拍洗澡| 日韩在线免费观看视频| 久久久噜久噜久久综合| 蜜臀久久99精品久久久无需会员| 欧美在线视频在线播放完整版免费观看| 亚洲最新av在线| 久久躁狠狠躁夜夜爽| 亚洲最大福利网站| 97香蕉超级碰碰久久免费的优势| 亚洲在线免费看| 欧美精品videossex性护士| 精品国产电影一区| 国产精品美女久久久久av超清| 97国产一区二区精品久久呦| 亚洲视频在线播放| 成人福利视频在线观看| 久久久久久免费精品| 一区二区欧美久久| 欧美日韩免费看| 亚洲香蕉伊综合在人在线视看| 日本最新高清不卡中文字幕| 亚洲一级黄色片| 91嫩草在线视频| 亚洲综合第一页| 91精品久久久久久久| 91高潮精品免费porn| 国产精品免费视频xxxx| 久久亚洲私人国产精品va| 欧美午夜视频在线观看|