日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

MySQL 分库拆表方案

發(fā)布時(shí)間:2023/12/15 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL 分库拆表方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本認(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。