教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Python分庫分表的幾種常見形式

更新時間:2017年12月21日16時08分 來源:傳智播客 瀏覽次數:

“分庫分表”是談論數據庫架構和優(yōu)化時經常聽到的關鍵詞。那么對于這些業(yè)務量正在高速增長的公司,它有那么容易實踐嗎?

垂直分表

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

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

拆分字段的操作建議在數據庫設計階段就做好。如果是在發(fā)展過程中拆分,則需要改寫以前的查詢語句,會額外帶來一定的成本和風險,建議謹慎。

垂直分庫

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

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

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

水平分表

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

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

水平分庫分表

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

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

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

總結和實踐建議

1. 我們目前的數據庫是否需要進行分庫分表?

根據系統(tǒng)架構和公司實際情況來,如果你們的系統(tǒng)還是個簡單的單體應用,并且沒有什么訪問量和數據量,那就別著急折騰“垂直分庫”了,否則沒有任何收益,也很難有好結果。

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

2. 有沒有原則或者技巧?

沒有什么黃金法則和標準答案。一般是參考系統(tǒng)的業(yè)務模塊拆分來進行數據庫的拆分。比如“用戶服務”,對應的可能就是“用戶數據庫”。但是也不一定嚴格一一對應。

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

本文版權歸傳智播客人工智能+Python學院所有,歡迎轉載,轉載請注明作者出處。謝謝!

作者:傳智播客人工智能+Python學院
0 分享到:
和我們在線交談!