MySQL:數(shù)據(jù)庫自增 ID 用完了會咋樣丁眼?

01 前言

數(shù)據(jù)庫中的自增 ID 用完了該怎么辦埠况?

這個問題其實可以分為有主鍵 & 無主鍵兩種情況回答耸携。

先上張腦圖:

02 有主鍵

如果你的表有主鍵,并且把主鍵設置為自增辕翰。

在 MySQL 中夺衍,一般會把主鍵設置成 int 型。而 MySQL 中 int 型占用 4 個字節(jié)喜命,作為有符號位的話范圍就是 [-231,231-1]沟沙,也就是[-2147483648,2147483647];無符號位的話最大值就是 2^32-1壁榕,也就是 4294967295矛紫。

下面以有符號位創(chuàng)建一張表:

CREATE TABLE IF NOT EXISTS `t`(
   `id` INT(11) NOT NULL AUTO_INCREMENT,
   `url` VARCHAR(64) NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
復制代碼

插入一個 id 為最大值 2147483647 的值,如下圖所示:

如果此時繼續(xù)下面的插入語句:

INSERT INTO t (url) VALUES ('wwww.javafish.top/article/erwt/spring')
復制代碼

結果就會造成主鍵沖突:


2.1 解決方案

雖說 int 4 個字節(jié)牌里,最大數(shù)據(jù)量能存儲 21 億颊咬。你可能會覺得這么大的容量,應該不至于用完二庵。但是互聯(lián)網時代贪染,每天都產生大量的數(shù)據(jù),這是很有可能達到的催享。

所以杭隙,我們的解決方案是:把主鍵類型改為 bigint,也就是 8 個字節(jié)因妙。這樣能存儲的最大數(shù)據(jù)量就是 2^64-1痰憎,我也數(shù)不清有多少了。反正在你有生之年應該是夠用的攀涵。

PS:單表 21 億的數(shù)據(jù)量顯然不現(xiàn)實铣耘,一般來說數(shù)據(jù)量達到 500 萬就該分表了

03 沒主鍵

另一種情況就是建表時沒設置主鍵以故。這種情況蜗细,InnoDB 會自動幫你創(chuàng)建一個不可見的、長度為 6 字節(jié)的 row_id,默認是無符號的炉媒,所以最大長度是 2^48-1踪区。

實際上 InnoDB 維護了一個全局的 dictsys.row_id,所以未定義主鍵的表都共享該 row_id吊骤,并不是單表獨享缎岗。每次插入一條數(shù)據(jù),都把全局 row_id 當成主鍵 id白粉,然后全局 row_id 加 1传泊。

這種情況的數(shù)據(jù)庫自增 ID 用完會發(fā)生什么呢?

1鸭巴、創(chuàng)建一張無顯示設置主鍵的表 t:

CREATE TABLE IF NOT EXISTS `t`(
   `age` int(4) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
復制代碼

2眷细、通過 ps -ef|grep mysql 命令獲取 mysql 的進程 ID,然后執(zhí)行命令奕扣,通過 gdb 先把 row_id 修改為 1薪鹦。PS:沒有 gdb 的,百度安裝下

sudo gdb -p 16111 -ex 'p dict_sys->row_id=1' -batch
復制代碼

出現(xiàn)下圖就是沒錯的:

3惯豆、插入三條數(shù)據(jù):

insert into t(age) values(1);
insert into t(age) values(2);
insert into t(age) values(3);

此時的數(shù)據(jù)庫數(shù)據(jù):

4池磁、gdb 把 row_id 修改為最大值:281474976710656

sudo gdb -p 16111 -ex 'p dict_sys->row_id=281474976710656' -batch

5、再插入三條數(shù)據(jù):

insert into t(age) values(4);
insert into t(age) values(5);
insert into t(age) values(6);

此事的數(shù)據(jù)庫數(shù)據(jù):

分析:

  • 剛開始設置 row_id 為 1楷兽,插入三條數(shù)據(jù) 1地熄、2、3 的 row_id 也理應是 1芯杀、2端考、3;這是沒問題的揭厚。

  • 接著設置 row_id 為最大值却特,緊跟著插入三條數(shù)據(jù)。這時的數(shù)據(jù)庫結果是:4筛圆、5裂明、6、3太援;你會發(fā)現(xiàn) 1闽晦、2 被覆蓋了。

  • row_id 達到后最大值后插入的值 4提岔、5仙蛉、6 的 row_id 分別是 0、1碱蒙、2荠瘪;由于 row_id 為 1、2 的值已存在,所以后者的值 5哀墓、6 會覆蓋掉 row_id 為 1鞭莽、2 的值。

結論:row_id 達到最大值后會從 0 重新開始算麸祷;前面插入的數(shù)據(jù)就會被后插入的數(shù)據(jù)覆蓋,且不會報錯褒搔。

04 總結

數(shù)據(jù)庫自增主鍵用完后分兩種情況:

  • 有主鍵阶牍,報主鍵沖突
  • 無主鍵,InnDB 會自動生成一個全局的row_id星瘾。它到達最大值后會從 0 開始算走孽,遇到 row_id 一樣時,新數(shù)據(jù)覆蓋舊數(shù)據(jù)琳状。所以磕瓷,我們還是盡量給表設置主鍵

我的回答除了以上解決方法外念逞,還提到在業(yè)務開發(fā)中困食,我們不會等到主鍵用完那天就已經分庫分表了,基本不會遇到這種情況翎承。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末硕盹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叨咖,更是在濱河造成了極大的恐慌瘩例,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甸各,死亡現(xiàn)場離奇詭異垛贤,居然都是意外死亡,警方通過查閱死者的電腦和手機趣倾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門聘惦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人誊酌,你說我怎么就攤上這事部凑。” “怎么了碧浊?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵涂邀,是天一觀的道長。 經常有香客問我箱锐,道長比勉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮浩聋,結果婚禮上观蜗,老公的妹妹穿的比我還像新娘。我一直安慰自己衣洁,他們只是感情好墓捻,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坊夫,像睡著了一般砖第。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上环凿,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天梧兼,我揣著相機與錄音,去河邊找鬼智听。 笑死羽杰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的到推。 我是一名探鬼主播考赛,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼环肘!你這毒婦竟也來了欲虚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤悔雹,失蹤者是張志新(化名)和其女友劉穎复哆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腌零,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡梯找,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了益涧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈锤。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闲询,靈堂內的尸體忽然破棺而出久免,到底是詐尸還是另有隱情,我是刑警寧澤扭弧,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布阎姥,位于F島的核電站,受9級特大地震影響鸽捻,放射性物質發(fā)生泄漏呼巴。R本人自食惡果不足惜泽腮,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衣赶。 院中可真熱鬧诊赊,春花似錦、人聲如沸府瞄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遵馆。三九已至续崖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間团搞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工多艇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逻恐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓峻黍,卻偏偏與公主長得像复隆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姆涩,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容