老大讓我優(yōu)化數(shù)據(jù)庫,我上來就分庫分表,他過來就是一jio。。。
來自:CSDN,作者:_陳哈哈
鏈接:https://blog.csdn.net/qq_39390545/article/details/116248222
- 一、樸實無華的 - 分表
- 1、垂直分表
- 2、水平分表
- 二、花里胡哨的 - 分庫
- 3、垂直分庫
- 4、水平分庫
- 總結(jié)
首先我們要知道分庫、分表都是干啥的,本文主角還是我們的MySQL為第一視角。首先從字面意思來看:
- 分庫:由單個數(shù)據(jù)庫實例拆分成多個數(shù)據(jù)庫實例,將數(shù)據(jù)分布到多個數(shù)據(jù)庫實例中。
- 分表:由單張表拆分成多張表,將數(shù)據(jù)劃分到多張表內(nèi)。
“硬傷”
。今天我們就基于常見分庫、分表的策略方式以及場景,來搞清楚我們到底啥時候用的到
。常用策略包括:垂直分表
、水平分表
、垂直分庫
、水平分庫
。一、樸實無華的 - 分表
1、垂直分表
垂直分表,或者叫豎著切表
,是不是感受到該策略是以字段為依據(jù)的!主要按照字段的活躍性、字段長度,將表中字段拆分到不同的表(主表和擴展表)中。特點:- 每個表的結(jié)構(gòu)都不一樣;
- 每個表的數(shù)據(jù)也不一樣,
- 有一個關(guān)聯(lián)字段,一般是主鍵或外鍵,用于關(guān)聯(lián)
兄弟表
數(shù)據(jù); - 所有兄弟表的并集是該表的全量數(shù)據(jù);
有幾個字段屬于熱點字段,更新頻率很高
,要把這些字段單獨切到一張表里,不然innodb行鎖很惡心的,鎖死你呀~~如用戶表里的余額字段?不,我的余額就很穩(wěn)定,一直是0。。有大字段,如text
,存儲壓力很大,畢竟innodb數(shù)據(jù)和索引是同一個文件;同時,我又喜歡用SELECT *,你懂得,這磁盤IO消耗的,跟玩兒似的,誰都扛不住的。有明顯的業(yè)務(wù)區(qū)分,或表結(jié)構(gòu)設(shè)計時字段冗余;
有些小伙伴看到第一點時,就發(fā)現(xiàn)陳哈哈是個菜雞,用戶表怎么會有余額字段?明顯有問題?。≮s緊先到評論區(qū)噴陳哈哈一波~~然后笑嘻嘻的發(fā)現(xiàn)原來是個小尾巴,真不要臉是吧。。是的,因此不同業(yè)務(wù)我們要把具體字段拆開,這樣才有利于業(yè)務(wù)后續(xù)擴展哦。
2、水平分表
水平分表,也叫“橫著切”。。以行數(shù)據(jù)為依據(jù)進行切分,一般按照某列的自容進行切分。如手機號表,我們可以通過前兩位或前三位進行切分,如131、132、133 → phone_131、phone_132、phone_133
,手機號有11位(100億),量大是很正常的事兒,這年頭誰家老頭老太太每個手機呢是吧。這樣切就把一張大表切成了好幾十張小表,數(shù)據(jù)量不就下來了。有同學就問了那我怎么知道我這手機號查哪個表呢?一看你就沒認真看前兩行標紅的點,為啥標紅嘞?比如我查131
00001111,那我截取前三位,動態(tài)拼接到查詢的表名上,就行了。特點:- 每個表的結(jié)構(gòu)都一樣;
- 每個表的數(shù)據(jù)都不一樣,沒有交集;
- 所有表的并集是該表的全量數(shù)據(jù);
二、花里胡哨的 - 分庫
需要你注意的是,傳統(tǒng)的分庫和我們熟悉的集群、主從復制可不是一個事兒
;多節(jié)點集群是將一個庫復制成N個庫,從而通過讀寫分離實現(xiàn)多個MySQL服務(wù)的負載均衡,實際是圍繞一個庫來搞的,這個庫稱為Master主庫。而分庫就不同了,分庫是將這個主庫一分為N,比如一分為二,然后針對這兩個主庫,再配置2N個從庫節(jié)點。3、垂直分庫
縱向切庫,太經(jīng)典的切分方式,基于表進行切分,通常是把新的業(yè)務(wù)模塊或集成公共模塊拆分出去,比如我們最熟悉的單點登錄、鑒權(quán)模塊。熟悉的味道,記得有一次我把一些沒用的表切到一個性能很好的服務(wù)器中,這服務(wù)器我專門用來學習,后來也不知被哪個狗腿子告密了~ 我**你個**,有種站出來,你個**東西。特點:
- 每個庫的表都不一樣;
- 表不一樣,數(shù)據(jù)就更不一樣了~ 沒有任何交集;
- 每個庫相對獨立,模塊化
4、水平分庫
以行數(shù)據(jù)為依據(jù),將一個庫中的數(shù)據(jù)拆分到多個庫中。大型分表體驗一下?坦白說這種策略并不實用,因為會對后臺開發(fā)很不友好,有很多坑,不建議采用,理解即可。特點:- 每個庫的結(jié)構(gòu)都一樣;
- 每個庫的數(shù)據(jù)都不一樣,沒有交集;
- 所有庫的并集是全量數(shù)據(jù);
總結(jié)
本文就到這里,希望你學廢了!其實,在實際工作中,我們在選擇分庫分表策略前,想到的應(yīng)該是從緩存、讀寫分離、SQL優(yōu)化等方面,因為這些能夠更直接、代價更小的解決問題。要記住動表就是動根本,你永遠不知道這張表后面會連帶多少歷史遺留問題
,如果是個很大型的項目,遇到些問題你就跟經(jīng)理提議要分庫分表,小心被呼死~