過某種特定的條件,將存放在同一個數據庫中的數據分散存放到多個數據庫上,實現分佈存儲,經過路由規則路由訪問特定的數據庫,這樣一來每次訪問面對的就不是單臺服務器了,而是N臺服務器,這樣就能夠下降單臺機器的負載壓力。提示:sqlserver 2005版本以後,能夠友好的支持「表分區」。html
垂直(縱向)拆分:是指按功能模塊拆分,好比分爲訂單庫、商品庫、用戶庫...這種方式多個數據庫之間的表結構不一樣。sql
水平(橫向)拆分:將同一個表的數據進行分塊保存到不一樣的數據庫中,這些數據庫中的表結構徹底相同。數據庫
▲(縱向拆分)服務器
▲(橫向拆分)併發
1,實現原理:使用垂直拆分,主要要看應用類型是否合適這種拆分方式,如系統能夠分爲,訂單系統,商品管理系統,用戶管理系統業務系統比較明的,垂直拆分能很好的起到分散數據庫壓力的做用。業務模塊不明晰,耦合(表關聯)度比較高的系統不適合使用這種拆分方式。可是垂直拆分方式並不能完全解決全部壓力問題,例如 有一個5000w的訂單表,操做起來訂單庫的壓力仍然很大,如咱們須要在這個表中增長(insert)一條新的數據,insert完畢後,數據庫會針對這張表從新創建索引,5000w行數據創建索引的系統開銷仍是不容忽視的,反過來,假如咱們將這個表分紅100個table呢,從table_001一直到table_100,5000w行數據平均下來,每一個子表裏邊就只有50萬行數據,這時候咱們向一張只有50w行數據的table中insert數據後創建索引的時間就會呈數量級的降低,極大了提升了DB的運行時效率,提升了DB的併發量,這種拆分就是橫向拆分sqlserver
2,實現方法:垂直拆分,拆分方式實現起來比較簡單,根據表名訪問不一樣的數據庫就能夠了。橫向拆分的規則不少,這裏總結前人的幾點,性能
(1)順序拆分:如能夠按訂單的日前按年份才分,2003年的放在db1中,2004年的db2,以此類推。固然也能夠按主鍵標準拆分。server
優勢:可部分遷移htm
缺點:數據分佈不均,可能2003年的訂單有100W,2008年的有500W。blog
(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信息,而後才能進行咱們須要的查詢操做。
優勢:靈活性強,一對一關係
缺點:每次查詢以前都要多一次查詢,會形成必定的性能損失。