您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)數(shù)據(jù)庫(kù)分庫(kù)分表后如何解決主鍵唯一的問(wèn)題,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
在此之前我們介紹了數(shù)據(jù)庫(kù)的分庫(kù)分表問(wèn)題,分庫(kù)分表可以給我們帶來(lái)非常好的擴(kuò)展性與性能上的提升,但也隨之帶來(lái)一些問(wèn)題,例如數(shù)據(jù)的主鍵ID分配問(wèn)題。我們以Mysql為例,通常我們使用的是數(shù)據(jù)庫(kù)的自增主鍵,我們?cè)诜直淼臅r(shí)候也盡量保證業(yè)務(wù)上不需要跨表查詢數(shù)據(jù),但是難免會(huì)遇到這樣的場(chǎng)景,這個(gè)時(shí)候我們就會(huì)面臨這樣一個(gè)問(wèn)題,如果兩張表上面的主鍵ID重復(fù),那么業(yè)務(wù)就會(huì)出錯(cuò),帶來(lái)不可估量的后果。
那么我們?nèi)绾谓鉀Q主鍵唯一的問(wèn)題呢?這里我們介紹幾種常見(jiàn)的方法,以及他們的優(yōu)缺點(diǎn)。
方法一
首先我們可以利用隨機(jī)方法生成主鍵,通常,只要隨機(jī)算法合理,適當(dāng)?shù)丶狱c(diǎn)鹽,生成的64位的主鍵ID,重復(fù)的概率極低(幾乎可以不用考慮碰撞),這種方法的優(yōu)點(diǎn)是實(shí)現(xiàn)非常簡(jiǎn)單,但是存在什么問(wèn)題呢?首先是ID的長(zhǎng)度會(huì)非常的長(zhǎng),我們都知道,在數(shù)據(jù)庫(kù)中,主鍵ID過(guò)長(zhǎng)會(huì)降低索引的性能。其次,隨機(jī)生成主鍵ID是無(wú)序的,這就意味著插入新的數(shù)據(jù)的時(shí)候,都需要插入索引,我們都知道Mysql的索引是B+樹(shù),B+樹(shù)如果不停地插入無(wú)序的數(shù)據(jù),性能會(huì)大大降低,造成的結(jié)果就是插入性能降低。聰明的同學(xué)可能已經(jīng)想到了,我們也可以生成有序的隨機(jī)數(shù),例如使用Twitter公司的SnowFlake,可以一定程度上避免B+樹(shù)插入帶來(lái)的影響。
方法二
第二種方法,我們還是可以利用數(shù)據(jù)庫(kù)的主鍵遞增特性。在Mysql數(shù)據(jù)庫(kù)中,是可以設(shè)置主鍵遞增的步長(zhǎng),也就是我們不必在1,2,3這樣遞增,假如我們?cè)O(shè)置步長(zhǎng)為10,開(kāi)始為10,那就是10,20,30了。假如我們分了10張表,那么我們可以讓每個(gè)表的起始分別是0到9,然后步長(zhǎng)設(shè)置為10,這樣子就可以保證十張表里面的數(shù)據(jù)不會(huì)重復(fù)了。這種方法的優(yōu)點(diǎn)同樣非常簡(jiǎn)單,只需要簡(jiǎn)單的配置而已,那么它存在什么問(wèn)題呢?首先是擴(kuò)展非常的不方便,如果我們想要把分表從10改成20呢?會(huì)給我們帶來(lái)一定的麻煩。
方法三
第三種方法,我們可以維護(hù)一個(gè)ID分配器,我們可以使用Redis等相關(guān)組件,將提前分配好的ID放在Redis的隊(duì)列當(dāng)中,每次業(yè)務(wù)要插入的時(shí)候,先從預(yù)分配的隊(duì)列中取一個(gè)元素出來(lái),然后再插入數(shù)據(jù)庫(kù)當(dāng)中。當(dāng)然這種做法需要一定的開(kāi)發(fā)量,可以相對(duì)保證主鍵id的順序,擴(kuò)展也相對(duì)的簡(jiǎn)單。
那么哪一種方法好呢?在計(jì)算機(jī)程序設(shè)計(jì)中,沒(méi)有絕對(duì)的好也沒(méi)有絕對(duì)地差,只要能夠貼近業(yè)務(wù),保證系統(tǒng)平穩(wěn)運(yùn)行,又不需要較大的開(kāi)發(fā)與維護(hù)成本,那就是好方法,需要根據(jù)自己的業(yè)務(wù)與現(xiàn)在的開(kāi)發(fā)運(yùn)維經(jīng)驗(yàn)進(jìn)行選擇。歡迎大家關(guān)注我,共同學(xué)習(xí),共同進(jìn)步。大家的支持是我繼續(xù)嘮嗑的動(dòng)力。
以上就是數(shù)據(jù)庫(kù)分庫(kù)分表后如何解決主鍵唯一的問(wèn)題,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。