MySQL 分库拆表方案
基本認(rèn)識(shí)
用分庫(kù)&拆表是解決數(shù)據(jù)庫(kù)容量問(wèn)題的唯一途徑。
分庫(kù)&拆表也是解決性能壓力的最優(yōu)選擇。
分庫(kù) – 不同的數(shù)據(jù)表放到不同的數(shù)據(jù)庫(kù)服務(wù)器中(也可能是虛擬服務(wù)器)
拆表 – 一張數(shù)據(jù)表拆成多張數(shù)據(jù)表,可能位于同一臺(tái)服務(wù)器,也可能位于多臺(tái)服務(wù)器(含虛擬服務(wù)器)。
去關(guān)聯(lián)化原則
摘除數(shù)據(jù)表之間的關(guān)聯(lián),是分庫(kù)的基礎(chǔ)工作。
摘除關(guān)聯(lián)的目的是,當(dāng)數(shù)據(jù)表分布到不同服務(wù)器時(shí),查詢請(qǐng)求容易分發(fā)和處理。
學(xué)會(huì)理解反范式數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),所謂反范式,第一要點(diǎn)是不用外鍵,不允許Join操作,不允許任何需要跨越兩個(gè)表的查詢請(qǐng)求。第二要點(diǎn)是適度冗余減少查詢請(qǐng)求,比如說(shuō),信息表,fromuid, touid, message字段外,還需要一個(gè)fromuname字段記錄用戶名,這樣查詢者通過(guò)touid查詢后,能夠立即得到發(fā)信人的用戶名,而無(wú)需進(jìn)行另一個(gè)數(shù)據(jù)表的查詢。
去關(guān)聯(lián)化處理會(huì)帶來(lái)額外的考慮,比如說(shuō),某一個(gè)數(shù)據(jù)表內(nèi)容的修改,對(duì)另一個(gè)數(shù)據(jù)表的影響。這一點(diǎn)需要在程序或其他途徑去考慮。
分庫(kù)方案
安全性拆分
將高安全性數(shù)據(jù)與低安全性數(shù)據(jù)分庫(kù),這樣的好處第一是便于維護(hù),第二是高安全性數(shù)據(jù)的數(shù)據(jù)庫(kù)參數(shù)配置可以以安全優(yōu)先,而低安全性數(shù)據(jù)的參數(shù)配置以性能優(yōu)先。參見(jiàn)運(yùn)維優(yōu)化相關(guān)部分。
順序?qū)憯?shù)據(jù)與隨機(jī)讀寫(xiě)數(shù)據(jù)分庫(kù)
順序數(shù)據(jù)與隨機(jī)數(shù)據(jù)區(qū)分存儲(chǔ)地址,保證物理i/o優(yōu)化。
基于業(yè)務(wù)邏輯拆分
根據(jù)數(shù)據(jù)表的內(nèi)容構(gòu)成,業(yè)務(wù)邏輯拆分,便于日常維護(hù)和前端調(diào)用。
基于業(yè)務(wù)邏輯拆分,可以減少前端應(yīng)用請(qǐng)求發(fā)送到不同數(shù)據(jù)庫(kù)服務(wù)器的頻次,從而減少鏈接開(kāi)銷。
基于業(yè)務(wù)邏輯拆分,可保留部分?jǐn)?shù)據(jù)關(guān)聯(lián),前端web工程師可在限度范圍內(nèi)執(zhí)行關(guān)聯(lián)查詢。
基于負(fù)載壓力拆分
基于負(fù)載壓力對(duì)數(shù)據(jù)結(jié)構(gòu)拆分,便于直接將負(fù)載分擔(dān)給不同的服務(wù)器。
基于負(fù)載壓力拆分,可能拆分后的數(shù)據(jù)庫(kù)包含不同業(yè)務(wù)類型的數(shù)據(jù)表,日常維護(hù)會(huì)有一定的煩惱。
分表方案
數(shù)據(jù)量過(guò)大或者訪問(wèn)壓力過(guò)大的數(shù)據(jù)表需要切分
忙閑分表
單數(shù)據(jù)表字段過(guò)多,可將頻繁更新的整數(shù)數(shù)據(jù)與非頻繁更新的字符串?dāng)?shù)據(jù)切分
范例user表 ,個(gè)人簡(jiǎn)介,地址,QQ號(hào),聯(lián)系方式,頭像 這些字段為字符串類型,更新請(qǐng)求少; 最后登錄時(shí)間,在線時(shí)常,訪問(wèn)次數(shù),信件數(shù)這些字段為整數(shù)型字段,更新頻繁,可以將后面這些更新頻繁的字段獨(dú)立拆出一張數(shù)據(jù)表,表內(nèi)容變少,索引結(jié)構(gòu)變少,讀寫(xiě)請(qǐng)求變快。
橫向切表
等分切表,如哈希切表或其他基于對(duì)某數(shù)字取余的切表。等分切表的優(yōu)點(diǎn)是負(fù)載很方便的分布到不同服務(wù)器;缺點(diǎn)是當(dāng)容量繼續(xù)增加時(shí)無(wú)法方便的擴(kuò)容,需要重新進(jìn)行數(shù)據(jù)的切分或轉(zhuǎn)表。而且一些關(guān)鍵主鍵不易處理。
遞增切表,比如每1kw用戶開(kāi)一個(gè)新表,優(yōu)點(diǎn)是可以適應(yīng)數(shù)據(jù)的自增趨勢(shì);缺點(diǎn)是往往新數(shù)據(jù)負(fù)載高,壓力分配不平均。
日期切表,適用于日志記錄式數(shù)據(jù),優(yōu)缺點(diǎn)等同于遞增切表。
個(gè)人傾向于遞增切表,具體根據(jù)應(yīng)用場(chǎng)景決定。
熱點(diǎn)數(shù)據(jù)分表
將數(shù)據(jù)量較大的數(shù)據(jù)表中將讀寫(xiě)頻繁的數(shù)據(jù)抽取出來(lái),形成熱點(diǎn)數(shù)據(jù)表。通常一個(gè)龐大數(shù)據(jù)表經(jīng)常被讀寫(xiě)的內(nèi)容往往具有一定的集中性,如果這些集中數(shù)據(jù)單獨(dú)處理,就會(huì)極大減少整體系統(tǒng)的負(fù)載。
熱點(diǎn)數(shù)據(jù)表與舊有數(shù)據(jù)關(guān)系
可以是一張冗余表,即該表數(shù)據(jù)丟失不會(huì)妨礙使用,因源數(shù)據(jù)仍存在于舊有結(jié)構(gòu)中。優(yōu)點(diǎn)是安全性高,維護(hù)方便,缺點(diǎn)是寫(xiě)壓力不能分擔(dān),仍需要同步寫(xiě)回原系統(tǒng)。
可以是非冗余表,即熱點(diǎn)數(shù)據(jù)的內(nèi)容原有結(jié)構(gòu)不再保存,優(yōu)點(diǎn)是讀寫(xiě)效率全部?jī)?yōu)化;缺點(diǎn)是當(dāng)熱點(diǎn)數(shù)據(jù)發(fā)生變化時(shí),維護(hù)量較大。
具體方案選擇需要根據(jù)讀寫(xiě)比例決定,在讀頻率遠(yuǎn)高于寫(xiě)頻率情況下,優(yōu)先考慮冗余表方案。
熱點(diǎn)數(shù)據(jù)表可以用單獨(dú)的優(yōu)化的硬件存儲(chǔ),比如昂貴的閃存卡或大內(nèi)存系統(tǒng)。
熱點(diǎn)數(shù)據(jù)表的重要指標(biāo)
熱點(diǎn)數(shù)據(jù)的定義需要根據(jù)業(yè)務(wù)模式自行制定策略,常見(jiàn)策略為,按照最新的操作時(shí)間;按照內(nèi)容豐富度等等。
數(shù)據(jù)規(guī)模,比如從1000萬(wàn)條數(shù)據(jù),抽取出100萬(wàn)條熱點(diǎn)數(shù)據(jù)。
熱點(diǎn)命中率,比如查詢10次,多少次命中在熱點(diǎn)數(shù)據(jù)內(nèi)。
理論上,數(shù)據(jù)規(guī)模越小,熱點(diǎn)命中率越高,說(shuō)明效果越好。需要根據(jù)業(yè)務(wù)自行評(píng)估。
熱點(diǎn)數(shù)據(jù)表的動(dòng)態(tài)維護(hù)
加載熱點(diǎn)數(shù)據(jù)方案選擇
定時(shí)從舊有數(shù)據(jù)結(jié)構(gòu)中按照新的策略獲取
在從舊有數(shù)據(jù)結(jié)構(gòu)讀取時(shí)動(dòng)態(tài)加載到熱點(diǎn)數(shù)據(jù)
剔除熱點(diǎn)數(shù)據(jù)方案選擇
基于特定策略,定時(shí)將熱點(diǎn)數(shù)據(jù)中訪問(wèn)頻次較少的數(shù)據(jù)剔除
如熱點(diǎn)數(shù)據(jù)是冗余表,則直接刪除即可,如不是冗余表,需要回寫(xiě)給舊有數(shù)據(jù)結(jié)構(gòu)。
通常,熱點(diǎn)數(shù)據(jù)往往是基于緩存或者key-value 方案冗余存儲(chǔ),所以這里提到的熱點(diǎn)數(shù)據(jù)表,其實(shí)更多是理解思路,用到的場(chǎng)合可能并不多….
表結(jié)構(gòu)設(shè)計(jì)
查詢?nèi)哂啾碓O(shè)計(jì)
涉及分表操作后,一些常見(jiàn)的索引查詢可能需要跨表,帶來(lái)不必要的麻煩。確認(rèn)查詢請(qǐng)求遠(yuǎn)大于寫(xiě)入請(qǐng)求時(shí),應(yīng)設(shè)置便于查詢項(xiàng)的冗余表。
實(shí)戰(zhàn)范例,
用戶分表,將用戶庫(kù)分成若干數(shù)據(jù)表
基于用戶名的查詢和基于uid的查詢都是高并發(fā)請(qǐng)求。
用戶分表基于uid分成數(shù)據(jù)表,同時(shí)基于用戶名做對(duì)應(yīng)冗余表。
冗余表要點(diǎn)
數(shù)據(jù)一致性,簡(jiǎn)單說(shuō),同增,同刪,同更新。
可以做全冗余,或者只做主鍵關(guān)聯(lián)的冗余,比如通過(guò)用戶名查詢uid,再基于uid查詢?cè)幢怼?/p>
中間數(shù)據(jù)表
為了減少會(huì)涉及大規(guī)模影響結(jié)果集的表數(shù)據(jù)操作,比如count,sum操作。應(yīng)將一些統(tǒng)計(jì)類數(shù)據(jù)通過(guò)中間數(shù)據(jù)表保存。
中間數(shù)據(jù)表應(yīng)能通過(guò)源數(shù)據(jù)表恢復(fù)。
實(shí)戰(zhàn)范例:
論壇板塊的發(fā)帖量,回帖量,每日新增數(shù)據(jù)等
網(wǎng)站每日新增用戶數(shù)等。
后臺(tái)可以通過(guò)源數(shù)據(jù)表更新該數(shù)字。
歷史數(shù)據(jù)表
歷史數(shù)據(jù)表對(duì)應(yīng)于熱點(diǎn)數(shù)據(jù)表,將需求較少又不能丟棄的數(shù)據(jù)存入,僅在少數(shù)情況下被訪問(wèn)
總結(jié)
以上是生活随笔為你收集整理的MySQL 分库拆表方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2-44钟静雯_day03
- 下一篇: linux cmake编译源码,linu