mysql數據庫的水平拆分與垂直拆分

**

mysql數據庫的水平拆分與垂直拆分

**
近端時間在面試,發現很多面試官或者面試都把數據的水平拆分合垂直拆分給搞混了,今天特意寫了一篇博客來說說水平拆分和垂直拆分希望對程序猿們有所幫助。

數據庫水平與垂直拆分:

垂直(縱向)拆分:是指按功能模塊拆分,比如分爲訂單庫、商品庫、用戶庫…這種方式多個數據庫之間的表結構不同。

水平(橫向)拆分:將同一個表的數據進行分塊保存到不同的數據庫中,這些數據庫中的表結構完全相同。

數據表的水平與垂直拆分:

垂直拆分:按字段功能主次拆分,比如最常見的商品表、商品圖片表、商品詳細信息…表與表之間的結構不同

水平拆分:同數據庫的水平拆分原理一樣主要是將數據進行拆分保存到不同的表當中,這些表的結構完全相同。、

使用用垂直拆分要主要看系統是否適合這種拆分方式,如系統可分爲用戶系統,商品系統、訂單系統等這些業務比較明確的比較適合使用垂直拆分,垂直拆分能很好分散數據庫壓力。業務模塊不清晰,模塊耦合度較高的系統並不適合垂直拆分。垂直拆分並不能徹底解決所有的壓力問題,例如有一張8000w的訂單表而且訂單隨着時間還在一直增加,操作起這張訂單表壓力依然很大,如我們需要在這個表中增加(insert)一條新的數據,insert完畢後,數據庫會針對這張表重新建立索引,8000w行數據建立索引的系統開銷還是不容忽視的,這類情況就可以使用到水平拆分了,可以將表分成100個table,table_001一直到table_100,8000w數據平均分下來就是80萬的數據(經過實際測試mysql數據量達到400w的時候性能明顯降低,故而應將單個mysql的數據量控制在300W以內),這時候我們向一張只有80w行數據的table中insert數據後建立索引的時間就會呈數量級的下降,極大了提高了DB的運行時效率,提高了DB的併發量,這種拆分就是水平(橫向)拆分

數據庫拆的實現方式:

垂直拆分,拆分方式實現起來比較簡單,根據表名訪問不同的數據庫就可以了這裏不多講。橫向拆分的規則很多,這裏總結了以下幾點:

1、順序拆分:例如訂單表可以按訂單的日期按年份才分,2016年的放在db1中,2017年的db2,以此類推。當然也可以按主鍵標準拆分。

  優點:可部分遷移

  缺點:數據分佈不均,可能2016年的訂單有200W,2017年的有800W。

2、hash取模分: 例如訂單表對user_id進行hash(或者如果user_id是數值型的話直接使用user_id的值也可),然後用一個特定的數字,比如應用中需要將一個數據庫切分成4個數據庫的話,我們就用4這個數字對user_id的hash值進行取模運算,也就是user_id%4,這樣的話每次運算就有四種可能:結果爲1的時候對應DB1;結果爲2的時候對應DB2;結果爲3的時候對應DB3;結果爲0的時候對應DB4,這樣一來就非常均勻的將數據分配到4個DB中。

優點:數據分佈均勻

缺點:數據遷移的時候麻煩;不能按照機器性能分攤數據 。

3、在認證庫中保存數據庫配置,就是建立一個DB,這個DB單獨保存user_id到DB的映射關係,每次訪問數據庫的時候都要先查詢一次這個數據庫,以得到具體的DB信息,然後才能進行我們需要的查詢操作。

優點:靈活性強,一對一關係

缺點:每次查詢之前都要多一次查詢,會造成一定的性能損失。

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