mysql数据库垂直切分_mysql数据库的水平拆分与垂直拆分
近端時(shí)間在面試,發(fā)現(xiàn)很多面試官或者面試都把數(shù)據(jù)的水平拆分合垂直拆分給搞混了,今天特意寫了一篇博客來說說水平拆分和垂直拆分希望對程序猿們有所幫助。
數(shù)據(jù)庫水平與垂直拆分:
垂直(縱向)拆分:是指按功能模塊拆分,比如分為訂單庫、商品庫、用戶庫...這種方式多個(gè)數(shù)據(jù)庫之間的表結(jié)構(gòu)不同。
水平(橫向)拆分:將同一個(gè)表的數(shù)據(jù)進(jìn)行分塊保存到不同的數(shù)據(jù)庫中,這些數(shù)據(jù)庫中的表結(jié)構(gòu)完全相同。
數(shù)據(jù)表的水平與垂直拆分:
垂直拆分:按字段功能主次拆分,比如最常見的商品表、商品圖片表、商品詳細(xì)信息...表與表之間的結(jié)構(gòu)不同
水平拆分:同數(shù)據(jù)庫的水平拆分原理一樣主要是將數(shù)據(jù)進(jìn)行拆分保存到不同的表當(dāng)中,這些表的結(jié)構(gòu)完全相同。、
使用用垂直拆分要主要看系統(tǒng)是否適合這種拆分方式,如系統(tǒng)可分為用戶系統(tǒng),商品系統(tǒng)、訂單系統(tǒng)等這些業(yè)務(wù)比較明確的比較適合使用垂直拆分,垂直拆分能很好分散數(shù)據(jù)庫壓力。業(yè)務(wù)模塊不清晰,模塊耦合度較高的系統(tǒng)并不適合垂直拆分。垂直拆分并不能徹底解決所有的壓力問題,例如有一張8000w的訂單表而且訂單隨著時(shí)間還在一直增加,操作起這張訂單表壓力依然很大,如我們需要在這個(gè)表中增加(insert)一條新的數(shù)據(jù),insert完畢后,數(shù)據(jù)庫會(huì)針對這張表重新建立索引,8000w行數(shù)據(jù)建立索引的系統(tǒng)開銷還是不容忽視的,這類情況就可以使用到水平拆分了,可以將表分成100個(gè)table,table_001一直到table_100,8000w數(shù)據(jù)平均分下來就是80萬的數(shù)據(jù)(經(jīng)過實(shí)際測試mysql數(shù)據(jù)量達(dá)到400w的時(shí)候性能明顯降低,故而應(yīng)將單個(gè)mysql的數(shù)據(jù)量控制在300W以內(nèi)),這時(shí)候我們向一張只有80w行數(shù)據(jù)的table中insert數(shù)據(jù)后建立索引的時(shí)間就會(huì)呈數(shù)量級(jí)的下降,極大了提高了DB的運(yùn)行時(shí)效率,提高了DB的并發(fā)量,這種拆分就是水平(橫向)拆分
數(shù)據(jù)庫拆的實(shí)現(xiàn)方式:
垂直拆分,拆分方式實(shí)現(xiàn)起來比較簡單,根據(jù)表名訪問不同的數(shù)據(jù)庫就可以了這里不多講。橫向拆分的規(guī)則很多,這里總結(jié)了以下幾點(diǎn):
1、順序拆分:例如訂單表可以按訂單的日期按年份才分,2016年的放在db1中,2017年的db2,以此類推。當(dāng)然也可以按主鍵標(biāo)準(zhǔn)拆分。
優(yōu)點(diǎn):可部分遷移
缺點(diǎn):數(shù)據(jù)分布不均,可能2016年的訂單有200W,2017年的有800W。
2、hash取模分: 例如訂單表對user_id進(jìn)行hash(或者如果user_id是數(shù)值型的話直接使用user_id的值也可),然后用一個(gè)特定的數(shù)字,比如應(yīng)用中需要將一個(gè)數(shù)據(jù)庫切分成4個(gè)數(shù)據(jù)庫的話,我們就用4這個(gè)數(shù)字對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,這樣一來就非常均勻的將數(shù)據(jù)分配到4個(gè)DB中。
優(yōu)點(diǎn):數(shù)據(jù)分布均勻
缺點(diǎn):數(shù)據(jù)遷移的時(shí)候麻煩;不能按照機(jī)器性能分?jǐn)倲?shù)據(jù) 。
3、在認(rèn)證庫中保存數(shù)據(jù)庫配置,就是建立一個(gè)DB,這個(gè)DB單獨(dú)保存user_id到DB的映射關(guān)系,每次訪問數(shù)據(jù)庫的時(shí)候都要先查詢一次這個(gè)數(shù)據(jù)庫,以得到具體的DB信息,然后才能進(jìn)行我們需要的查詢操作。
優(yōu)點(diǎn):靈活性強(qiáng),一對一關(guān)系
缺點(diǎn):每次查詢之前都要多一次查詢,會(huì)造成一定的性能損失。
ps:暫時(shí)只想到這些希望對大家有幫助,如果有更好的方法歡迎留言區(qū)評論交流
總結(jié)
以上是生活随笔為你收集整理的mysql数据库垂直切分_mysql数据库的水平拆分与垂直拆分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 色弱怎么治疗 眼睛(色弱会遗传吗)
- 下一篇: 为什么hive需要mysql作为数据库_