什么是分庫分表【轉(zhuǎn)】

一、什么是分庫分表稚照?

其實就是字面意思,很好理解:

分庫:將原來存放在單個數(shù)據(jù)庫中的數(shù)據(jù)俯萌,拆分到多個數(shù)據(jù)庫中存放果录。

分表:將原來存放在單個表中的數(shù)據(jù),拆分到多個表中存放咐熙。

二弱恒、為什么要分庫分表?

關(guān)鍵字:提升性能糖声、增加可用性。

從性能上看

隨著單庫中的數(shù)據(jù)量越來越大、數(shù)據(jù)庫的查詢QPS越來越高蘸泻,相應(yīng)的琉苇,對數(shù)據(jù)庫的讀寫所需要的時間也越來越多。數(shù)據(jù)庫的讀寫性能可能會成為業(yè)務(wù)發(fā)展的瓶頸悦施。對應(yīng)的并扇,就需要做數(shù)據(jù)庫性能方面的優(yōu)化。本文中我們只討論數(shù)據(jù)庫層面的優(yōu)化抡诞,不討論緩存等應(yīng)用層優(yōu)化的手段穷蛹。

從可用性上看

單個數(shù)據(jù)庫如果發(fā)生意外,很可能會丟失所有數(shù)據(jù)昼汗。尤其是云時代肴熏,很多數(shù)據(jù)庫都跑在虛擬機(jī)上,如果虛擬機(jī)/宿主機(jī)發(fā)生意外顷窒,則可能造成無法挽回的損失蛙吏。因此,除了傳統(tǒng)的 Master-Slave鞋吉、Master-Master 等部署層面解決可靠性問題外鸦做,我們也可以考慮從數(shù)據(jù)拆分層面解決此問題。

三谓着、如何分庫分表

下邊以電商系統(tǒng)中的例子來說明泼诱,下圖是電商系統(tǒng)賣家模塊的表結(jié)構(gòu):


通過以下SQL能夠獲取到商品相關(guān)的店鋪信息、地理區(qū)域信息:


隨著公司業(yè)務(wù)快速發(fā)展赊锚,數(shù)據(jù)庫中的數(shù)據(jù)量猛增治筒,訪問性能也變慢了,優(yōu)化迫在眉睫改抡。分析一下問題出現(xiàn)在哪兒呢矢炼? 關(guān)系型數(shù)據(jù)庫本身比較容易成為系統(tǒng)瓶頸,單機(jī)存儲容量阿纤、連接數(shù)句灌、處理能力都有限。當(dāng)單表的數(shù)據(jù)量達(dá)到1000W或100G以后欠拾,由于查詢維度較多胰锌,即使添加從庫、優(yōu)化索引藐窄,做很多操作時性能仍下降嚴(yán)重资昧。

方案1:

通過提升服務(wù)器硬件能力來提高數(shù)據(jù)處理能力,比如增加存儲容量 荆忍、CPU等格带,這種方案成本很高撤缴,并且如果瓶頸在MySQL本身那么提高硬件也是有很的。

方案2:

把數(shù)據(jù)分散在不同的數(shù)據(jù)庫中叽唱,使得單一數(shù)據(jù)庫的數(shù)據(jù)量變小來緩解單一數(shù)據(jù)庫的性能問題屈呕,從而達(dá)到提升數(shù)據(jù)庫性能的目的,如下圖:將電商數(shù)據(jù)庫拆分為若干獨立的數(shù)據(jù)庫棺亭,并且對于大表也拆分為若干小表虎眨,通過這種數(shù)據(jù)庫拆分的方法來解決數(shù)據(jù)庫的性能問題。

分庫分表就是為了解決由于數(shù)據(jù)量過大而導(dǎo)致數(shù)據(jù)庫性能降低的問題镶摘,將原來獨立的數(shù)據(jù)庫拆分成若干數(shù)據(jù)庫組成 嗽桩,將數(shù)據(jù)大表拆分成若干數(shù)據(jù)表組成,使得單一數(shù)據(jù)庫凄敢、單一數(shù)據(jù)表的數(shù)據(jù)量變小碌冶,從而達(dá)到提升數(shù)據(jù)庫性能的目的。

垂直分表

分庫分表包括分庫和分表兩個部分贡未,在生產(chǎn)中通常包括:垂直分庫种樱、水平分庫、垂直分表俊卤、水平分表四種方式嫩挤。

先說 垂直分表:

通常在商品列表中是不顯示商品詳情信息的,如下圖:

用戶在瀏覽商品列表時消恍,只有對某商品感興趣時才會查看該商品的詳細(xì)描述岂昭。因此,商品信息中商品描述字段訪問頻次較低狠怨,且該字段存儲占用空間較大约啊,訪問單個數(shù)據(jù)IO時間較長;商品信息中商品名稱佣赖、商品圖片恰矩、商品價格等其他字段數(shù)據(jù)訪問頻次較高。

由于這兩種數(shù)據(jù)的特性不一樣憎蛤,因此他考慮將商品信息表拆分如下:

將訪問頻次低的商品描述信息單獨存放在一張表中外傅,訪問頻次較高的商品基本信息單獨放在一張表中。

商品列表可采用以下sql:

需要獲取商品描述時俩檬,再通過以下sql獲任取:

垂直分表定義:將一個表按照字段分成多表,每個表存儲其中一部分字段棚辽。

它帶來的提升是:

1.為了避免IO爭搶并減少鎖表的幾率技竟,查看詳情的用戶與商品信息瀏覽互不影響

2.充分發(fā)揮熱門數(shù)據(jù)的操作效率,商品信息的操作的高效率不會被商品描述的低效率所拖累屈藐。

為什么大字段IO效率低:第一是由于數(shù)據(jù)量本身大榔组,需要更長的讀取時間熙尉;第二是跨頁,頁是數(shù)據(jù)庫存儲單位搓扯,很多查找及定位操作都是以頁為單位骡尽,單頁內(nèi)的數(shù)據(jù)行越多數(shù)據(jù)庫整體性能越好,而大字段占用空間大擅编,單頁內(nèi)存儲行數(shù)少,因此IO效率較低箫踩。第三爱态,數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內(nèi)存中,這樣表中字段長度較短且訪問頻率較高境钟,內(nèi)存能加載更多的數(shù)據(jù)锦担,命中率更高,減少了磁盤IO慨削,從而提升了數(shù)據(jù)庫性能洞渔。

一般來說,某業(yè)務(wù)實體中的各個數(shù)據(jù)項的訪問頻次是不一樣的缚态,部分?jǐn)?shù)據(jù)項可能是占用存儲空間比較大的BLOB或是TEXT磁椒。例如上例中的商品描述。所以玫芦,當(dāng)表數(shù)據(jù)量很大時浆熔,可以將表按字段切開,將熱門字段桥帆、冷門字段分開放置在不同庫中医增,這些庫可以放在不同的存儲設(shè)備上,避免IO爭搶老虫。垂直切分帶來的性能提升主要集中在熱門數(shù)據(jù)的操作效率上叶骨,而且磁盤爭用情況減少。

通常我們按以下原則進(jìn)行垂直拆分:

把不常用的字段單獨放在一張表;

把text祈匙,blob等大字段拆分出來放在附表中;

經(jīng)常組合查詢的列放在一張表中;

垂直分庫

通過垂直分表性能得到了一定程度的提升忽刽,但是還沒有達(dá)到要求,并且磁盤空間也快不夠了菊卷,因為數(shù)據(jù)還是始終限制在一臺服務(wù)器缔恳,庫內(nèi)垂直分表只解決了單一表數(shù)據(jù)量過大的問題,但沒有將表分布到不同的服務(wù)器上洁闰,因此每個表還是競爭同一個物理機(jī)的CPU歉甚、內(nèi)存、網(wǎng)絡(luò)IO扑眉、磁盤纸泄。

經(jīng)過思考赖钞,他把原有的SELLER_DB(賣家?guī)?,分為了PRODUCT_DB(商品庫)和STORE_DB(店鋪庫)聘裁,并把這兩個庫分散到不同服務(wù)器雪营,如下圖:

由于商品信息與商品描述業(yè)務(wù)耦合度較高,因此一起被存放在PRODUCT_DB(商品庫)衡便;而店鋪信息相對獨立献起,因此單獨被存放在STORE_DB(店鋪庫)。

垂直分庫是指按照業(yè)務(wù)將表進(jìn)行分類镣陕,分布到不同的數(shù)據(jù)庫上面谴餐,每個庫可以放在不同的服務(wù)器上,它的核心理念是專庫專用呆抑。

它帶來的提升是:

解決業(yè)務(wù)層面的耦合岂嗓,業(yè)務(wù)清晰

能對不同業(yè)務(wù)的數(shù)據(jù)進(jìn)行分級管理、維護(hù)鹊碍、監(jiān)控厌殉、擴(kuò)展等

高并發(fā)場景下,垂直分庫一定程度的提升IO侈咕、數(shù)據(jù)庫連接數(shù)公罕、降低單機(jī)硬件資源的瓶頸

垂直分庫通過將表按業(yè)務(wù)分類,然后分布在不同數(shù)據(jù)庫耀销,并且可以將這些數(shù)據(jù)庫部署在不同服務(wù)器上熏兄,從而達(dá)到多個服務(wù)器共同分?jǐn)倝毫Φ男Ч且廊粵]有解決單表數(shù)據(jù)量過大的問題树姨。

水平分庫

經(jīng)過垂直分庫后摩桶,數(shù)據(jù)庫性能問題得到一定程度的解決,但是隨著業(yè)務(wù)量的增長帽揪,PRODUCT_DB(商品庫)單庫存儲數(shù)據(jù)已經(jīng)超出預(yù)估硝清。粗略估計,目前有8w店鋪转晰,每個店鋪平均150個不同規(guī)格的商品芦拿,再算上增長,那商品數(shù)量得往1500w+上預(yù)估查邢,并且PRODUCT_DB(商品庫)屬于訪問非常頻繁的資源蔗崎,單臺服務(wù)器已經(jīng)無法支撐。此時該如何優(yōu)化扰藕?

再次分庫缓苛?但是從業(yè)務(wù)角度分析,目前情況已經(jīng)無法再次垂直分庫邓深。

嘗試水平分庫未桥,將店鋪ID為單數(shù)的和店鋪ID為雙數(shù)的商品信息分別放在兩個庫中笔刹。

也就是說,要操作某條數(shù)據(jù)冬耿,先分析這條數(shù)據(jù)所屬的店鋪ID舌菜。如果店鋪ID為雙數(shù),將此操作映射至RRODUCT_DB1(商品庫1)亦镶;如果店鋪ID為單數(shù)日月,將操作映射至RRODUCT_DB2(商品庫2)。此操作要訪問數(shù)據(jù)庫名稱的表達(dá)式為RRODUCT_DB[店鋪ID%2 + 1] 缤骨。

水平分庫是把同一個表的數(shù)據(jù)按一定規(guī)則拆到不同的數(shù)據(jù)庫中山孔,每個庫可以放在不同的服務(wù)器上。

垂直分庫是把不同表拆到不同數(shù)據(jù)庫中荷憋,它是對數(shù)據(jù)行的拆分,不影響表結(jié)構(gòu)

它帶來的提升是:

解決了單庫大數(shù)據(jù)褐望,高并發(fā)的性能瓶頸勒庄。

提高了系統(tǒng)的穩(wěn)定性及可用性。

穩(wěn)定性體現(xiàn)在IO沖突減少瘫里,鎖定減少实蔽,可用性指某個庫出問題,部分可用`

當(dāng)一個應(yīng)用難以再細(xì)粒度的垂直切分谨读,或切分后數(shù)據(jù)量行數(shù)巨大局装,存在單庫讀寫、存儲性能瓶頸劳殖,這時候就需要進(jìn)行水平分庫了铐尚,經(jīng)過水平切分的優(yōu)化,往往能解決單庫存儲量及性能瓶頸哆姻。但由于同一個表被分配在不同的數(shù)據(jù)庫宣增,需要額外進(jìn)行數(shù)據(jù)操作的路由工作,因此大大提升了系統(tǒng)復(fù)雜度矛缨。

水平分表

按照水平分庫的思路對他把PRODUCT_DB_X(商品庫)內(nèi)的表也可以進(jìn)行水平拆分爹脾,其目的也是為解決單表數(shù)據(jù)量大的問題,如下圖:

與水平分庫的思路類似箕昭,不過這次操作的目標(biāo)是表灵妨,商品信息及商品描述被分成了兩套表。如果商品ID為雙數(shù)落竹,將此操作映射至商品信息1表泌霍;如果商品ID為單數(shù),將操作映射至商品信息2表述召。此操作要訪問表名稱的表達(dá)式為商品信息[商品ID%2 + 1] 烹吵。

水平分表是在同一個數(shù)據(jù)庫內(nèi)碉熄,把同一個表的數(shù)據(jù)按一定規(guī)則拆到多個表中。

它帶來的提升是:

優(yōu)化單一表數(shù)據(jù)量過大而產(chǎn)生的性能問題

避免IO爭搶并減少鎖表的幾率

庫內(nèi)的水平分表肋拔,解決了單一表數(shù)據(jù)量過大的問題锈津,分出來的小表中只包含一部分?jǐn)?shù)據(jù),從而使得單個表的數(shù)據(jù)量變小凉蜂,提高檢索性能琼梆。

總結(jié)

垂直分表:可以把一個寬表的字段按訪問頻次、是否是大字段的原則拆分為多個表窿吩,這樣既能使業(yè)務(wù)清晰茎杂,還能提升部分性能。拆分后纫雁,盡量從業(yè)務(wù)角度避免聯(lián)查煌往,否則性能方面將得不償失。

垂直分庫:可以把多個表按業(yè)務(wù)耦合松緊歸類轧邪,分別存放在不同的庫刽脖,這些庫可以分布在不同服務(wù)器,從而使訪問壓力被多服務(wù)器負(fù)載忌愚,大大提升性能曲管,同時能提高整體架構(gòu)的業(yè)務(wù)清晰度,不同的業(yè)務(wù)庫可根據(jù)自身情況定制優(yōu)化方案硕糊。但是它需要解決跨庫帶來的所有復(fù)雜問題院水。

水平分庫:可以把一個表的數(shù)據(jù)(按數(shù)據(jù)行)分到多個不同的庫,每個庫只有這個表的部分?jǐn)?shù)據(jù)简十,這些庫可以分布在不同服務(wù)器檬某,從而使訪問壓力被多服務(wù)器負(fù)載,大大提升性能螟蝙。它不僅需要解決跨庫帶來的所有復(fù)雜問題橙喘,還要解決數(shù)據(jù)路由的問題(數(shù)據(jù)路由問題后邊介紹)。

水平分表:可以把一個表的數(shù)據(jù)(按數(shù)據(jù)行)分到多個同一個數(shù)據(jù)庫的多張表中胶逢,每個表只有這個表的部分?jǐn)?shù)據(jù)厅瞎,這樣做能小幅提升性能,它僅僅作為水平分庫的一個補(bǔ)充優(yōu)化初坠。

一般來說和簸,在系統(tǒng)設(shè)計階段就應(yīng)該根據(jù)業(yè)務(wù)耦合松緊來確定垂直分庫,垂直分表方案碟刺,在數(shù)據(jù)量及訪問壓力不是特別大的情況锁保,首先考慮緩存、讀寫分離、索引技術(shù)等方案爽柒。若數(shù)據(jù)量極大吴菠,且持續(xù)增長,再考慮水平分庫水平分表方案浩村。

轉(zhuǎn)自:https://www.zhihu.com/question/448775613

https://blog.csdn.net/weixin_44062339/article/details/100491744

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末做葵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子心墅,更是在濱河造成了極大的恐慌酿矢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怎燥,死亡現(xiàn)場離奇詭異瘫筐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铐姚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門策肝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隐绵,你說我怎么就攤上這事之众。” “怎么了氢橙?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恬偷。 經(jīng)常有香客問我悍手,道長,這世上最難降的妖魔是什么袍患? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任坦康,我火速辦了婚禮,結(jié)果婚禮上诡延,老公的妹妹穿的比我還像新娘滞欠。我一直安慰自己,他們只是感情好肆良,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布筛璧。 她就那樣靜靜地躺著,像睡著了一般惹恃。 火紅的嫁衣襯著肌膚如雪夭谤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天巫糙,我揣著相機(jī)與錄音朗儒,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛醉锄,可吹牛的內(nèi)容都是我干的乏悄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恳不,長吁一口氣:“原來是場噩夢啊……” “哼檩小!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妆够,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤识啦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后神妹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颓哮,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年鸵荠,在試婚紗的時候發(fā)現(xiàn)自己被綠了冕茅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛹找,死狀恐怖姨伤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庸疾,我是刑警寧澤乍楚,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站届慈,受9級特大地震影響徒溪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜金顿,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一臊泌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揍拆,春花似錦渠概、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筒狠,卻和暖如春剪芍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窟蓝。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工罪裹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留饱普,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓状共,卻偏偏與公主長得像套耕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峡继,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容