http://blog.csdn.net/iloveyin/article/details/39996831
通過(guò)某種特定的條件荣堰,將存放在同一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)分散存放到多個(gè)數(shù)據(jù)庫(kù)上斜棚,實(shí)現(xiàn)分布存儲(chǔ)卖鲤,通過(guò)路由規(guī)則路由訪問(wèn)特定的數(shù)據(jù)庫(kù)雹洗,這樣一來(lái)每次訪問(wèn)面對(duì)的就不是單臺(tái)服務(wù)器了,而是N臺(tái)服務(wù)器,這樣就可以降低單臺(tái)機(jī)器的負(fù)載壓力先慷。提示:sqlserver 2005版本之后,可以友好的支持“表分區(qū)”咨察。
垂直(縱向)拆分:是指按功能模塊拆分论熙,比如分為訂單庫(kù)、商品庫(kù)摄狱、用戶(hù)庫(kù)...這種方式多個(gè)數(shù)據(jù)庫(kù)之間的表結(jié)構(gòu)不同赴肚。
水平(橫向)拆分:將同一個(gè)表的數(shù)據(jù)進(jìn)行分塊保存到不同的數(shù)據(jù)庫(kù)中,這些數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)完全相同二蓝。
▲(縱向拆分)
▲(橫向拆分)
1,實(shí)現(xiàn)原理:使用垂直拆分指厌,主要要看應(yīng)用類(lèi)型是否合適這種拆分方式刊愚,如系統(tǒng)可以分為,訂單系統(tǒng)踩验,商品管理系統(tǒng)鸥诽,用戶(hù)管理系統(tǒng)業(yè)務(wù)系統(tǒng)比較明的,垂直拆分能很好的起到分散數(shù)據(jù)庫(kù)壓力的作用箕憾。業(yè)務(wù)模塊不明晰牡借,耦合(表關(guān)聯(lián))度比較高的系統(tǒng)不適合使用這種拆分方式。但是垂直拆分方式并不能徹底解決所有壓力問(wèn)題袭异,例如 有一個(gè)5000w的訂單表钠龙,操作起來(lái)訂單庫(kù)的壓力仍然很大,如我們需要在這個(gè)表中增加(insert)一條新的數(shù)據(jù)御铃,insert完畢后碴里,數(shù)據(jù)庫(kù)會(huì)針對(duì)這張表重新建立索引,5000w行數(shù)據(jù)建立索引的系統(tǒng)開(kāi)銷(xiāo)還是不容忽視的上真,反過(guò)來(lái)咬腋,假如我們將這個(gè)表分成100個(gè)table呢,從table_001一直到table_100睡互,5000w行數(shù)據(jù)平均下來(lái)根竿,每個(gè)子表里邊就只有50萬(wàn)行數(shù)據(jù),這時(shí)候我們向一張只有50w行數(shù)據(jù)的table中insert數(shù)據(jù)后建立索引的時(shí)間就會(huì)呈數(shù)量級(jí)的下降就珠,極大了提高了DB的運(yùn)行時(shí)效率寇壳,提高了DB的并發(fā)量,這種拆分就是橫向拆分
2嗓违,實(shí)現(xiàn)方法:垂直拆分九巡,拆分方式實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,根據(jù)表名訪問(wèn)不同的數(shù)據(jù)庫(kù)就可以了蹂季。橫向拆分的規(guī)則很多冕广,這里總結(jié)前人的幾點(diǎn)疏日,
(1)順序拆分:如可以按訂單的日前按年份才分,2003年的放在db1中撒汉,2004年的db2,以此類(lèi)推沟优。當(dāng)然也可以按主鍵標(biāo)準(zhǔn)拆分。
優(yōu)點(diǎn):可部分遷移
缺點(diǎn):數(shù)據(jù)分布不均睬辐,可能2003年的訂單有100W挠阁,2008年的有500W。
(2)hash取模分: 對(duì)user_id進(jìn)行hash(或者如果user_id是數(shù)值型的話直接使用user_id的值也可)溯饵,然后用一個(gè)特定的數(shù)字侵俗,比如應(yīng)用中需要將一個(gè)數(shù)據(jù)庫(kù)切分成4個(gè)數(shù)據(jù)庫(kù)的話,我們就用4這個(gè)數(shù)字對(duì)user_id的hash值進(jìn)行取模運(yùn)算丰刊,也就是user_id%4,這樣的話每次運(yùn)算就有四種可能:結(jié)果為1的時(shí)候?qū)?yīng)DB1;結(jié)果為2的時(shí)候?qū)?yīng)DB2;結(jié)果為3的時(shí)候?qū)?yīng)DB3;結(jié)果為0的時(shí)候?qū)?yīng)DB4隘谣,這樣一來(lái)就非常均勻的將數(shù)據(jù)分配到4個(gè)DB中。
優(yōu)點(diǎn):數(shù)據(jù)分布均勻
缺點(diǎn):數(shù)據(jù)遷移的時(shí)候麻煩;不能按照機(jī)器性能分?jǐn)倲?shù)據(jù) 啄巧。
(3)在認(rèn)證庫(kù)中保存數(shù)據(jù)庫(kù)配置
就是建立一個(gè)DB寻歧,這個(gè)DB單獨(dú)保存user_id到DB的映射關(guān)系,每次訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候都要先查詢(xún)一次這個(gè)數(shù)據(jù)庫(kù)秩仆,以得到具體的DB信息码泛,然后才能進(jìn)行我們需要的查詢(xún)操作。
優(yōu)點(diǎn):靈活性強(qiáng)澄耍,一對(duì)一關(guān)系
缺點(diǎn):每次查詢(xún)之前都要多一次查詢(xún)噪珊,會(huì)造成一定的性能損失。