1.按功能劃分(垂直切分)
將不同功能相關(guān)的表放到不同的數(shù)據(jù)庫中,這樣做的好處是非常直觀。但當(dāng)某一部分的功能其數(shù)據(jù)量或性能要求超出了可控的范圍,就需要繼續(xù)對其進(jìn)行深入的再切分。
2.按表中某一字段值的范圍劃分(水平切分)
當(dāng)伴隨著某一個表的數(shù)據(jù)量越來越大,以至于不能承受的時候,就需要對它進(jìn)行進(jìn)一步的切分。一種選擇是根據(jù)key 的范圍來做切分,譬如ID 為 1-10000的放到A上,ID 為10000~20000的放到B。這樣的擴(kuò)展就是可預(yù)見的。另一種是根據(jù)某一字段值來劃分,譬如根據(jù)用戶名的首字母,如果是A-D,就屬于A,E-H就屬于B。這樣做也存在不均衡性,當(dāng)某個范圍超出了單點所能承受的范圍就需要繼續(xù)切分。還有按日期切分等等。
優(yōu)點:單表大小可控,天然水平擴(kuò)展
缺點:無法解決集中寫入瓶頸的問題
3.基于hash的切分
一般采用mod來切分,一開始確定切分?jǐn)?shù)據(jù)庫的個數(shù),通過hash取模來決定使用哪臺。這種方法能夠平均地來分配數(shù)據(jù),但是伴隨著數(shù)據(jù)量的增大,需要進(jìn)行擴(kuò)展的時候,這種方式無法做到在線擴(kuò)容。每增加節(jié)點的時候,就需要對hash 算法重新運算。
所以采用這種方法推薦采用mod 2^n這種一致性哈希
以點評統(tǒng)一訂單庫為例,分庫分表的方案是32*32的,即通過userId后四位mod 32分到32個庫中,同時再將userId后四位div 32 mod 32將每個庫分為32個表,共計分為1024張表。其線上部署情況為8個集群(主從),每個集群4個庫
4.基于路由表的切分
前面的幾種方式都是根據(jù)應(yīng)用的數(shù)據(jù)來決定操作的,基于路由表的切分是一種更加松散的方法。它單獨維護(hù)一張路由表,根據(jù)用戶的某一屬性來查找路由表決定使用哪個數(shù)據(jù)庫,這種方式是一種更加通用的方案
優(yōu)點:id和庫的mapping算法可以隨意更改
缺點:可能引入額外的單點
關(guān)于數(shù)據(jù)庫拆分的幾種方式分別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機(jī)的問題,請訪問西部數(shù)碼官網(wǎng):m.ps-sw.cn