最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談MySQL中的自增主鍵用完了怎么辦

 更新時(shí)間:2020年11月13日 10:52:39   作者:誰(shuí)動(dòng)了我的bug  
這篇文章主要介紹了淺談MySQL中的自增主鍵用完了怎么辦,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在面試中,大家應(yīng)該經(jīng)歷過(guò)如下場(chǎng)景

面試官:"用過(guò)mysql吧,你們是用自增主鍵還是UUID?"   

你:"用的是自增主鍵"    

面試官:"為什么是自增主鍵?"    

你:"因?yàn)椴捎米栽鲋麈I,數(shù)據(jù)在物理結(jié)構(gòu)上是順序存儲(chǔ),性能最好,blabla…"    

面試官:"那自增主鍵達(dá)到最大值了,用完了怎么辦?"    

你:"what,沒(méi)復(fù)習(xí)啊??!"    (然后,你就可以回去等通知了!)

這個(gè)問(wèn)題是一個(gè)粉絲給我提的,我覺(jué)得挺有意(KENG)思(B)!
于是,今天我們就來(lái)談一談,這個(gè)自增主鍵用完了該怎么辦!

正文

簡(jiǎn)單版

我們先明白一點(diǎn),在mysql中,Int整型的范圍如下

我們以無(wú)符號(hào)整型為例,存儲(chǔ)范圍為0~4294967295,約43億!我們先說(shuō)一下,一旦自增id達(dá)到最大值,此時(shí)數(shù)據(jù)繼續(xù)插入是會(huì)報(bào)一個(gè)主鍵沖突異常如下所示

//Duplicate entry '4294967295' for key 'PRIMARY'

那解決方法也是很簡(jiǎn)單的,將Int類(lèi)型改為BigInt類(lèi)型,BigInt的范圍如下

就算你每秒10000條數(shù)據(jù),跑100年,單表的數(shù)據(jù)也才
10000*24*3600*365*100=31536000000000
這數(shù)字距離BigInt的上限還差的遠(yuǎn),因此你將自增ID設(shè)為BigInt類(lèi)型,你是不用考慮自增ID達(dá)到最大值這個(gè)問(wèn)題!
然而,如果你在面試中的回答如果是

你:"簡(jiǎn)單啊,把自增主鍵的類(lèi)型改為BigInt類(lèi)型就好了!"

接下來(lái),面試官可以問(wèn)你一個(gè)更坑的問(wèn)題!

面試官:"你在線(xiàn)上怎么修改列的數(shù)據(jù)類(lèi)型的?"   

你:"what!我還是回等通知吧!"

怎么改

目前業(yè)內(nèi)在線(xiàn)修改表結(jié)構(gòu)的方案,據(jù)我了解,一般有如下三種

方式一:使用mysql5.6+提供的在線(xiàn)修改功能

所謂的mysql自己提供的功能也就是mysql自己原生的語(yǔ)句,例如我們要修改原字段名稱(chēng)及類(lèi)型。

mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;

那么,在mysql5.5這個(gè)版本之前,這是通過(guò)臨時(shí)表拷貝的方式實(shí)現(xiàn)的。執(zhí)行ALTER語(yǔ)句后,會(huì)新建一個(gè)帶有新結(jié)構(gòu)的臨時(shí)表,將原表數(shù)據(jù)全部拷貝到臨時(shí)表,然后Rename,完成創(chuàng)建操作。這個(gè)方式過(guò)程中,原表是可讀的,不可寫(xiě)。
在5.6+開(kāi)始,mysql支持在線(xiàn)修改數(shù)據(jù)庫(kù)表,在修改表的過(guò)程中,對(duì)絕大部分操作,原表可讀,也可以寫(xiě)。
那么,對(duì)于修改列的數(shù)據(jù)類(lèi)型這種操作,原表還能寫(xiě)么?來(lái)來(lái)來(lái),特意去官網(wǎng)找了mysql8.0版本的一張圖

如圖所示,對(duì)于修改數(shù)據(jù)類(lèi)型這種操作,是不支持并發(fā)的DML操作!也就是說(shuō),如果你直接使用ALTER這樣的語(yǔ)句在線(xiàn)修改表數(shù)據(jù)結(jié)構(gòu),會(huì)導(dǎo)致這張表無(wú)法進(jìn)行更新類(lèi)操作(DELETE、UPDATEDELETE)。
因此,直接ALTER是不行滴!

那我們只能用方式二或者方式三

方式二:借助第三方工具

業(yè)內(nèi)有一些第三方工具可以支持在線(xiàn)修改表結(jié)構(gòu),使用這些第三發(fā)工具,能夠讓你在執(zhí)行ALTER操作的時(shí)候,表不會(huì)阻塞!比較出名的有兩個(gè)

  • pt-online-schema-change,簡(jiǎn)稱(chēng)pt-osc
  • GitHub正式宣布以開(kāi)源的方式發(fā)布的工具,名為gh-ost

pt-osc為例,它的原理如下

1、創(chuàng)建一個(gè)新的表,表結(jié)構(gòu)為修改后的數(shù)據(jù)表,用于從源數(shù)據(jù)表向新表中導(dǎo)入數(shù)據(jù)。

2、創(chuàng)建觸發(fā)器,用于記錄從拷貝數(shù)據(jù)開(kāi)始之后,對(duì)源數(shù)據(jù)表繼續(xù)進(jìn)行數(shù)據(jù)修改的操作記錄下來(lái),用于數(shù)據(jù)拷貝結(jié)束后,執(zhí)行這些操作,保證數(shù)據(jù)不會(huì)丟失。

3、拷貝數(shù)據(jù),從源數(shù)據(jù)表中拷貝數(shù)據(jù)到新表中。

4、rename源數(shù)據(jù)表為old表,把新表rename為源表名,并將old表刪除。

5、刪除觸發(fā)器。

然而這兩個(gè)有意(KENG)思(B)的工具,居然。。。居然。。。唉!如果你的表里有觸發(fā)器和外鍵,這兩個(gè)工具是不行滴!
如果真碰上了數(shù)據(jù)庫(kù)里有觸發(fā)器和外鍵,只能硬杠了,請(qǐng)看方式三
方式三:改從庫(kù)表結(jié)構(gòu),然后主從切換
此法極其麻煩,需要專(zhuān)業(yè)水平的選手進(jìn)行操作。因?yàn)槲覀兊膍ysql架構(gòu)一般是讀寫(xiě)分離架構(gòu),從機(jī)是用來(lái)讀的。我們直接在從庫(kù)上進(jìn)行表結(jié)構(gòu)修改,不會(huì)阻塞從庫(kù)的讀操作。改完之后,進(jìn)行主從切換即可。唯一需要注意的是,主從切換過(guò)程中可能會(huì)有數(shù)據(jù)丟失的情況!

高深版

其實(shí)答完上面的問(wèn)題后,這篇文章差不多完了。但是,還記得我在開(kāi)頭說(shuō)的么。這是一個(gè)很有意(KENG)思(B)的問(wèn)題,為什么呢?
假設(shè)啊,你的表里的自增字段為有符號(hào)的Int類(lèi)型的,也就是說(shuō),你的字段范圍為-2147483648到2147483648。
一切又那么剛好,你的自增ID是從0開(kāi)始的,也就是說(shuō),現(xiàn)在你的可以用的范圍為0~2147483648。
我們明確一點(diǎn),表中真實(shí)的數(shù)據(jù)ID,肯定會(huì)出現(xiàn)一些意外,ID不一定是連續(xù)的。例如,有如下情形的出現(xiàn)

CREATE TABLE `t` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`),
) EN

執(zhí)行下列SQL

insert into t values(null);
// 插入的行是 (1)
begin;
insert into t values(null);
rolllack;
insert into t values(null);
// 插入的行是 (3)

因此,表中的真實(shí)id必然會(huì)出現(xiàn)斷續(xù)的情況。
好,那這會(huì)你的自增主鍵id的數(shù)據(jù)范圍為0~2147483648,也就是單表21億條數(shù)據(jù)!考慮id會(huì)出現(xiàn)斷續(xù),真實(shí)數(shù)據(jù)頂多18億條吧。
老哥,都單表18億條了,還不分庫(kù)分表?你一旦分庫(kù)分表了,就不能依賴(lài)于每個(gè)表的自增ID來(lái)全局唯一標(biāo)識(shí)這些數(shù)據(jù)了。此時(shí),我們就需要提供一 個(gè)全局唯一的ID號(hào)生成策略來(lái)支持分庫(kù)分表的環(huán)境。

因此在實(shí)際中,你根本等不到自增主鍵用完到情形!因此,專(zhuān)業(yè)版回答如下:

面試官:"那自增主鍵達(dá)到最大值了,用完了怎么辦?"   

你:"這問(wèn)題沒(méi)遇到過(guò),因?yàn)樽栽鲋麈I我們用int類(lèi)型,一般達(dá)不到最大值,我們就分庫(kù)分表了,所以不曾遇見(jiàn)過(guò)!"

到此這篇關(guān)于淺談MySQL中的自增主鍵用完了怎么辦的文章就介紹到這了,更多相關(guān)MySQL 自增主鍵用完內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 雙向備份的實(shí)現(xiàn)方法

    MySQL 雙向備份的實(shí)現(xiàn)方法

    這篇文章主要介紹了MySQL 雙向備份的實(shí)現(xiàn)方法,即兩個(gè) MySQL 服務(wù)都是 Master,其中任意一個(gè)服務(wù)又是另一個(gè)服務(wù)的 Slave,感興趣的可以了解一下
    2019-04-04
  • 修改MySQL所有表的編碼或修改某個(gè)字段的編碼步驟詳解

    修改MySQL所有表的編碼或修改某個(gè)字段的編碼步驟詳解

    這篇文章主要給大家介紹了關(guān)于修改MySQL所有表的編碼或修改某個(gè)字段編碼的相關(guān)資料,在進(jìn)行數(shù)據(jù)庫(kù)編碼更改之前,需要先確定目標(biāo)編碼格式,常見(jiàn)的編碼格式有UTF-8、GBK等,需要的朋友可以參考下
    2023-12-12
  • 深入解析MySQL中的longtext與longblob及應(yīng)用場(chǎng)景

    深入解析MySQL中的longtext與longblob及應(yīng)用場(chǎng)景

    MySQL作為廣泛應(yīng)用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),提供了豐富的數(shù)據(jù)類(lèi)型以滿(mǎn)足各種數(shù)據(jù)存儲(chǔ)需求,本文將深入探討MySQL中l(wèi)ongtext和longblob的特性、區(qū)別以及在實(shí)際項(xiàng)目中的應(yīng)用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • mysql IS NULL使用索引案例講解

    mysql IS NULL使用索引案例講解

    這篇文章主要介紹了mysql IS NULL使用索引案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MySQL 8.0 redo log的深入解析

    MySQL 8.0 redo log的深入解析

    這篇文章主要介紹了MySQL 8.0 redo log的深入解析,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-03-03
  • 一文帶你學(xué)會(huì)Mysql表批量添加字段

    一文帶你學(xué)會(huì)Mysql表批量添加字段

    本文主要介紹了MySQL表如何批量添加字段的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Windows10下mysql 8.0.22 安裝配置方法圖文教程

    Windows10下mysql 8.0.22 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows10下mysql 8.0.22 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 通過(guò)命令行導(dǎo)入到mysql數(shù)據(jù)庫(kù)時(shí)出現(xiàn)亂碼的解決方法

    通過(guò)命令行導(dǎo)入到mysql數(shù)據(jù)庫(kù)時(shí)出現(xiàn)亂碼的解決方法

    原因: 含有中文字符的mysql數(shù)據(jù)庫(kù)文件,通過(guò)命令行導(dǎo)入到mysql數(shù)據(jù)庫(kù)中容易出現(xiàn)亂碼。
    2014-07-07
  • 詳解MySQL的數(shù)據(jù)行和行溢出機(jī)制

    詳解MySQL的數(shù)據(jù)行和行溢出機(jī)制

    在前面的文章中,白日夢(mèng)曾不止一次的提及到:InnoDB從磁盤(pán)中讀取數(shù)據(jù)的最小單位是數(shù)據(jù)頁(yè)。 而你想得到的id = xxx的數(shù)據(jù),就是這個(gè)數(shù)據(jù)頁(yè)眾多行中的一行。 這篇文章我們就一起來(lái)看一下數(shù)據(jù)行設(shè)計(jì)的多么巧妙。
    2020-11-11
  • MySql安裝及登錄詳解

    MySql安裝及登錄詳解

    這篇文章主要介紹了MySql安裝及登錄詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

建昌县| 河曲县| 滁州市| 班戈县| 任丘市| 佳木斯市| 玉溪市| 密山市| 东辽县| 乌海市| 紫云| 维西| 班戈县| 西平县| 临汾市| 晋宁县| 东莞市| 林甸县| 黄平县| 万安县| 西乌| 洞口县| 南皮县| 广饶县| 达日县| 察雅县| 浦东新区| 峨边| 响水县| 罗定市| 云林县| 阿城市| 项城市| 昂仁县| 南涧| 临安市| 万年县| 阳春市| 新龙县| 青海省| 丰原市|