網(wǎng)站建設(shè)要程序員嗎直接下載app
一、什么是分庫(kù)分表
????????
? ? ? ? 分庫(kù)分表就是指在一個(gè)數(shù)據(jù)庫(kù)在存儲(chǔ)數(shù)據(jù)過(guò)大,或者一個(gè)表存儲(chǔ)數(shù)據(jù)過(guò)多的情況下,為了提高數(shù)據(jù)存儲(chǔ)的可持續(xù)性,查詢數(shù)據(jù)的性能而進(jìn)行的將單一庫(kù)或者表分成多個(gè)庫(kù),表使用。
二、為什么要分庫(kù)分表
? ? ? ? 分庫(kù)分表其實(shí)是兩個(gè)操作,分庫(kù)是指將單一數(shù)據(jù)庫(kù)分成多個(gè)數(shù)據(jù)庫(kù)使用,分表是指將單一表分成多個(gè)表使用。
? ? ? ? 分庫(kù)是因?yàn)樵趩我粩?shù)據(jù)庫(kù)的情況下,單一數(shù)據(jù)庫(kù)存儲(chǔ)空間有限,如果存儲(chǔ)到達(dá)臨界,需要分配物理存儲(chǔ)資源,所以可以通過(guò)分庫(kù)來(lái)增加數(shù)據(jù)存儲(chǔ)量。在大量進(jìn)行插入操作的時(shí)候,對(duì)單一數(shù)據(jù)庫(kù)的性能會(huì)影響很大,所以使用分庫(kù)可以將單一數(shù)據(jù)庫(kù)分成多個(gè)庫(kù)承受插入操作,性能會(huì)更高。還有單一數(shù)據(jù)庫(kù)在高并發(fā)的情況下很容易連接數(shù)用盡,報(bào)too many connection,可以通過(guò)配置文件設(shè)置最大連接數(shù)。用分庫(kù)的話會(huì)有多個(gè)數(shù)據(jù)庫(kù),承受并發(fā)情況更好,線程用盡的情況更小一些。
????????
? ? ? ? 分表是因?yàn)閱我粩?shù)據(jù)表的存儲(chǔ)數(shù)據(jù)容量過(guò)大,對(duì)于阿里規(guī)范中它說(shuō)明是單一表的存儲(chǔ)容量大于2G,或單表存儲(chǔ)數(shù)據(jù)的容量大于500w,通過(guò)命中索引,優(yōu)化SQL對(duì)于查詢數(shù)據(jù)的效率沒有提升的情況下就需要分表。
三、怎么分庫(kù)分表
? ? ? ? 分庫(kù)分表實(shí)際上分為有兩種分發(fā),一種是垂直分庫(kù)分表,另一種是水平分庫(kù)分表。
? ? ? ? 1.垂直分庫(kù)分表
? ? ? ? 垂直分庫(kù)的意思就是,將一個(gè)數(shù)據(jù)庫(kù)里的多個(gè)表拆分,例如有數(shù)據(jù)庫(kù)A和B,數(shù)據(jù)庫(kù)本應(yīng)該有1234張表,垂直分庫(kù)的意思是將庫(kù)中的某幾張表存到A中,剩下的存儲(chǔ)到B中。
? ? ? ? 垂直分表的意思是,表中有字段1234,現(xiàn)在將這個(gè)數(shù)據(jù)表中的數(shù)據(jù)拆分到兩個(gè)表A、B中,比如A表存儲(chǔ)字段123,B表存儲(chǔ)4,然后A表和B表可以通過(guò)一個(gè)主鍵外鍵相關(guān)聯(lián)。這樣的好處是指,因?yàn)橐粋€(gè)表中一個(gè)數(shù)據(jù)存儲(chǔ)過(guò)大,但是有幾個(gè)字段不頻繁使用,如果在大量頻繁查詢的過(guò)程會(huì)造成I/O增加。
? ? ? ? 對(duì)于垂直分庫(kù)的情況下原本同一張數(shù)據(jù)表中的內(nèi)容分到不同的庫(kù)中不同表中,對(duì)于查詢?nèi)孔侄蔚臅r(shí)候就需要多表聯(lián)查,但是在mycat中有些版本不支持,所以需要將某些表設(shè)置成全局表,這樣就能在每個(gè)庫(kù)都有該表,可以進(jìn)行多表聯(lián)查。
? ? ? ? 2.水平分庫(kù)分表
? ? ? ? 水平分庫(kù)的意思和水平分表的意思差不多。水平分庫(kù)指將庫(kù)中的數(shù)據(jù)表與另一個(gè)庫(kù)的表一塊進(jìn)行存儲(chǔ)數(shù)據(jù)。分表意思是兩個(gè)表同時(shí)對(duì)同一種數(shù)據(jù)進(jìn)行存儲(chǔ)。
? ? ? ? 這種就行避免單表進(jìn)行查詢的時(shí)候,在索引sql優(yōu)化之后還是查詢慢的情況。
? ? ? ? 學(xué)過(guò)一種是代理模式的叫做mycat的中間件(可以進(jìn)行分庫(kù)分表,還可以進(jìn)行讀寫分離),這種有一個(gè)虛擬庫(kù),通過(guò)配置虛擬表然后配置節(jié)點(diǎn),以及節(jié)點(diǎn)信息,比如設(shè)置dataHost路由信息。對(duì)于分庫(kù)水平分表還需要設(shè)置分片規(guī)則,比如常用的根據(jù)id范圍分配,取模分片,將主鍵轉(zhuǎn)成2進(jìn)制與對(duì)應(yīng)個(gè)1取余后根據(jù)范圍分配,還有枚舉分片,一致性hash分配指的是將主鍵根據(jù)hash算法算出后,存儲(chǔ)到對(duì)應(yīng)的分片的表中,還有按照時(shí)間進(jìn)行分片。
四、分庫(kù)分表可能會(huì)出現(xiàn)的問(wèn)題
? ? ? ? 1.聯(lián)合查詢的時(shí)候跨節(jié)點(diǎn)查詢
? ? ? ? ? ? ? ? 這種情況下有些版本或者其他中間件可能會(huì)智能聯(lián)查,但實(shí)際上就是通過(guò)不同庫(kù)的不同表中間的數(shù)據(jù),直接查出來(lái)最后合并后返回結(jié)構(gòu),過(guò)程復(fù)雜繁瑣。
? ? ? ? 2.全局唯一主鍵
? ? ? ? ? ? ? ? 對(duì)于不同庫(kù)或者不同表中,存儲(chǔ)數(shù)據(jù)可能會(huì)出現(xiàn)id唯一的問(wèn)題,主鍵肯定是要唯一的,但是對(duì)于分表后還要保持id唯一是不太容易的,可以設(shè)置一個(gè)表專門設(shè)置主鍵id自增,分表存儲(chǔ)數(shù)據(jù)時(shí)候可以根據(jù)這個(gè)id存到數(shù)據(jù)表的主鍵里。不過(guò)這個(gè)id 是由數(shù)據(jù)庫(kù)生成的并且由單表生成,如果并發(fā)大的情況下這個(gè)表壓力會(huì)過(guò)大生產(chǎn)較慢。或者使用UUID,這種是全局唯一的id但是它的順序可能不一致,可能會(huì)出現(xiàn)存儲(chǔ)過(guò)程IO消耗過(guò)大,因?yàn)榭赡軙?huì)出現(xiàn)頁(yè)分裂現(xiàn)象。還有就是雪花算法這種雖然id的長(zhǎng)度過(guò)大,但是自增且唯一。
? ? ? ? 3.實(shí)物一致性的問(wèn)題
? ? ? ? ? ? ? ? 對(duì)于多個(gè)表,如果是垂直分庫(kù)的情況下,插入數(shù)據(jù)無(wú)法保證兩個(gè)庫(kù)的數(shù)據(jù)都同時(shí)存儲(chǔ)成功,或者都失敗,失敗后回滾。