數據庫的垂直切分、水平切分

常見的分庫、分表形式(垂直分表、垂直分庫、水平分表、水平分庫)
        
垂直分表:通俗的說法叫做“大表拆小表”,拆分是基於關係型數據庫中的“列”(字段)進行的。通常情況,某個表中的字段比較多,可以新建立一張“擴展表”,將不經常使用或者長度較大的字段拆分出去放到“擴展表”中。拆分到多臺數據庫(主機)上面,這種切分稱之爲數據的水平(橫向)切分。

優點:拆分後業務清晰,拆分規則明確;便於開發和維護;避免“跨頁”的問題(MySQL、MSSQL底層都是通過“數據頁”來存儲的,“跨頁”問題可能會造成額外的性能開銷)。
缺點:部分業務表無法 join,只能通過接口方式解決,提高了系統複雜度;受每種業務不同的限制存在單庫性能瓶頸,不易數據擴展跟性能提高;事務處理複雜。 

垂直分庫:基本的思路就是按照業務模塊來劃分出不同的數據庫,而不是像早期一樣將所有的數據表都放到同一個數據庫中。

ps:數據庫的連接資源比較寶貴且單機處理能力也有限,在高併發場景下,垂直分庫一定程度上能夠突破IO、連接數及單機硬件資源的瓶頸,是大型分佈式系統中優化數據庫架構的重要手段;由於垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與存儲瓶 
頸,所以就需要水平拆分來做解決。

水平分表:水平分表也稱爲橫向分表,比較容易理解,就是將表中不同的數據行按照一定規律分佈到不同的數據庫表中(這些表保存在同一個數據庫中)。能夠降低單表的數據量,一定程度上可以緩解查詢性能瓶頸。但本質上這些表還保存在同一個庫中,所以庫級別還是會有IO瓶頸。所以,一般不建議採用這種做法。

優點:降低單表數據量,優化查詢性能,提高了系統的穩定性跟負載能力;
缺點:雖然分表了,但本質上這些表還保存在同一個庫中,所以庫級別還是會有IO瓶頸。所以,一般不建議採用這種做法;有些業務可能還存在查詢(根據指定條件查詢列表)、分頁、排序問題。

最常見的分表方式就是通過主鍵或者時間等字段進行Hash和取模後拆分。

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

ps:某種意義上來講,有些系統中使用的“冷熱數據分離”(將一些使用較少的歷史數據遷移到其他的數據庫中。而在業務功能上,通常默認只提供熱點數據的查詢),也是類似的實踐。在高併發和海量數據的場景下,分庫分表能夠有效緩解單機和單庫的性能瓶頸和壓力,突破IO、連接數、硬件資源的瓶頸。當然,投入的硬件成本也會更高。同時,這也會帶來一些複雜的技術問題和挑戰(例如:跨分片的複雜查詢,跨分片事務等)
 

 

 

參考 https://blog.csdn.net/echojson/article/details/79684682

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章