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