首頁(yè)技術(shù)文章正文

Python分庫(kù)分表的幾種常見(jiàn)形式

更新時(shí)間:2017-12-21 來(lái)源:黑馬程序員 瀏覽量:

“分庫(kù)分表”是談?wù)摂?shù)據(jù)庫(kù)架構(gòu)和優(yōu)化時(shí)經(jīng)常聽(tīng)到的關(guān)鍵詞。那么對(duì)于這些業(yè)務(wù)量正在高速增長(zhǎng)的公司,它有那么容易實(shí)踐嗎?

垂直分表

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

Python分庫(kù)分表

在字段很多的情況下,拆分開(kāi)確實(shí)更便于開(kāi)發(fā)和維護(hù)。

拆分字段的操作建議在數(shù)據(jù)庫(kù)設(shè)計(jì)階段就做好。如果是在發(fā)展過(guò)程中拆分,則需要改寫(xiě)以前的查詢語(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ù)中。如下圖:

Python分庫(kù)分表

系統(tǒng)層面的“服務(wù)化”拆分操作,能夠解決業(yè)務(wù)系統(tǒng)層面的耦合和性能瓶頸,有利于系統(tǒng)的擴(kuò)展維護(hù)。也能對(duì)不同業(yè)務(wù)類(lèi)型的數(shù)據(jù)進(jìn)行“分級(jí)”管理、維護(hù)、監(jiān)控、擴(kuò)展等。

在高并發(fā)場(chǎng)景下,垂直分庫(kù)一定程度上能夠突破IO、連接數(shù)及單機(jī)硬件資源的瓶頸,是大型分布式系統(tǒng)中優(yōu)化數(shù)據(jù)庫(kù)架構(gòu)的重要手段。

水平分表

水平分表也稱為橫向分表,比較容易理解,就是將表中不同的數(shù)據(jù)行按照一定規(guī)律分布到不同的數(shù)據(jù)庫(kù)表中(這些表保存在同一個(gè)數(shù)據(jù)庫(kù)中),這樣來(lái)降低單表數(shù)據(jù)量,優(yōu)化查詢性能。最常見(jiàn)的方式就是通過(guò)主鍵或者時(shí)間等字段進(jìn)行Hash和取模后拆分。如下圖所示:

Python分庫(kù)分表

水平分表,能夠降低單表的數(shù)據(jù)量,一定程度上可以緩解查詢性能瓶頸。

水平分庫(kù)分表

水平分庫(kù)分表與上面講到的水平分表的思想相同,唯一不同的就是將這些拆分出來(lái)的表保存在不同的數(shù)據(jù)中。這也是很多大型互聯(lián)網(wǎng)公司所選擇的做法。如下圖:

Python分庫(kù)分表

某種意義上來(lái)講,有些系統(tǒng)中使用的“冷熱數(shù)據(jù)分離”(將一些使用較少的歷史數(shù)據(jù)遷移到其他的數(shù)據(jù)庫(kù)中。而在業(yè)務(wù)功能上,通常默認(rèn)只提供熱點(diǎn)數(shù)據(jù)的查詢),也是類(lèi)似的實(shí)踐。

在高并發(fā)和海量數(shù)據(jù)的場(chǎng)景下,分庫(kù)分表能夠有效緩解單機(jī)和單庫(kù)的性能瓶頸和壓力,突破IO、連接數(shù)、硬件資源的瓶頸。當(dāng)然,投入的硬件成本也會(huì)更高。同時(shí),這也會(huì)帶來(lái)一些復(fù)雜的技術(shù)問(wèn)題和挑戰(zhàn)(例如:跨分片的復(fù)雜查詢,跨分片事務(wù)等)

總結(jié)和實(shí)踐建議

1. 我們目前的數(shù)據(jù)庫(kù)是否需要進(jìn)行分庫(kù)分表?

根據(jù)系統(tǒng)架構(gòu)和公司實(shí)際情況來(lái),如果你們的系統(tǒng)還是個(gè)簡(jiǎn)單的單體應(yīng)用,并且沒(méi)有什么訪問(wèn)量和數(shù)據(jù)量,那就別著急折騰“垂直分庫(kù)”了,否則沒(méi)有任何收益,也很難有好結(jié)果。

切記,“過(guò)度設(shè)計(jì)”和“過(guò)早優(yōu)化”是很多架構(gòu)師和技術(shù)人員常犯的毛病。

2. 有沒(méi)有原則或者技巧?

沒(méi)有什么黃金法則和標(biāo)準(zhǔn)答案。一般是參考系統(tǒng)的業(yè)務(wù)模塊拆分來(lái)進(jìn)行數(shù)據(jù)庫(kù)的拆分。比如“用戶服務(wù)”,對(duì)應(yīng)的可能就是“用戶數(shù)據(jù)庫(kù)”。但是也不一定嚴(yán)格一一對(duì)應(yīng)。

3. 后臺(tái)系統(tǒng)中join的表都有n個(gè)了,其實(shí)互聯(lián)網(wǎng)的業(yè)務(wù)系統(tǒng)中,本來(lái)就應(yīng)該盡量避免join的,如果有多個(gè)join的,要么是設(shè)計(jì)不合理,要么是技術(shù)選型有誤。


本文版權(quán)歸黑馬程序員人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!


作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院


首發(fā):http://python.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!