在談?wù)摂?shù)據(jù)庫(kù)架構(gòu)和數(shù)據(jù)庫(kù)優(yōu)化的時(shí)候,我們經(jīng)常會(huì)聽(tīng)到“分庫(kù)分表”、“分片”、“Sharding”…這樣的關(guān)鍵詞。讓人感到高興的是,這些朋友所服務(wù)的公司業(yè)務(wù)量正在(或者即將面臨)高速增長(zhǎng),技術(shù)方面也面臨著一些挑戰(zhàn)。讓人感到擔(dān)憂的是,他們系統(tǒng)真的就需要“分庫(kù)分表”了嗎?“分庫(kù)分表”有那么容易實(shí)踐嗎?為此,筆者整理了分庫(kù)分表中可能遇到的一些問(wèn)題,并結(jié)合以往經(jīng)驗(yàn)介紹了對(duì)應(yīng)的解決思路和建議。

垂直分表

垂直分表在日常開(kāi)發(fā)和設(shè)計(jì)中比較常見(jiàn),通俗的說(shuō)法叫做“大表拆小表”,拆分是基于關(guān)系型數(shù)據(jù)庫(kù)中的“列”(字段)進(jìn)行的。通常情況,某個(gè)表中的字段比較多,可以新建立一張“擴(kuò)展表”,將不經(jīng)常使用或者長(zhǎng)度較大的字段拆分出去放到“擴(kuò)展表”中,如下圖所示:

小結(jié)

 

在字段很多的情況下,拆分開(kāi)確實(shí)更便于開(kāi)發(fā)和維護(hù)(筆者曾見(jiàn)過(guò)某個(gè)遺留系統(tǒng)中,一個(gè)大表中包含100多列的)。某種意義上也能避免“跨頁(yè)”的問(wèn)題(MySQL、MSSQL底層都是通過(guò)“數(shù)據(jù)頁(yè)”來(lái)存儲(chǔ)的,“跨頁(yè)”問(wèn)題可能會(huì)造成額外的性能開(kāi)銷,這里不展開(kāi),感興趣的朋友可以自行查閱相關(guān)資料進(jìn)行研究)。

拆分字段的操作建議在數(shù)據(jù)庫(kù)設(shè)計(jì)階段就做好。如果是在發(fā)展過(guò)程中拆分,則需要改寫以前的查詢語(yǔ)句,會(huì)額外帶來(lái)一定的成本和風(fēng)險(xiǎn),建議謹(jǐn)慎。

垂直分庫(kù)

垂直分庫(kù)在“微服務(wù)”盛行的今天已經(jīng)非常普及了?;镜乃悸肪褪前凑諛I(yè)務(wù)模塊來(lái)劃分出不同的數(shù)據(jù)庫(kù),而不是像早期一樣將所有的數(shù)據(jù)表都放到同一個(gè)數(shù)據(jù)庫(kù)中。如下圖: