關(guān)系型數(shù)據(jù)庫本身比較容易成為系統(tǒng)瓶頸,單機(jī)存儲(chǔ)容量、連接數(shù)、處理能力都有限。當(dāng)單表的數(shù)據(jù)量達(dá)到1000W或100G以后,由于查詢維度較多,即使添加從庫、優(yōu)化索引,做很多操作時(shí)性能仍下降嚴(yán)重。此時(shí)就要考慮對(duì)其進(jìn)行切分了,切分的目的就在于減少數(shù)據(jù)庫的負(fù)擔(dān),縮短查詢時(shí)間。
數(shù)據(jù)庫分布式核心內(nèi)容無非就是數(shù)據(jù)切分(Sharding)以及切分后對(duì)數(shù)據(jù)的定位、整合。數(shù)據(jù)切分就是將數(shù)據(jù)分散存儲(chǔ)到多個(gè)數(shù)據(jù)庫中,使得單一數(shù)據(jù)庫中的數(shù)據(jù)量變小,通過擴(kuò)充主機(jī)的數(shù)量緩解單一數(shù)據(jù)庫的性能問題,從而達(dá)到提升數(shù)據(jù)庫操作性能的目的。
數(shù)據(jù)切分根據(jù)其切分類型,可以分為兩種方式:垂直(縱向)切分和水平(橫向)切分。
垂直切分常見有垂直分庫和垂直分表兩種。
就是根據(jù)業(yè)務(wù)耦合性,將關(guān)聯(lián)度低的不同表存儲(chǔ)在不同的數(shù)據(jù)庫。做法與大系統(tǒng)拆分為多個(gè)小系統(tǒng)類似,按業(yè)務(wù)
分類進(jìn)行獨(dú)立劃分。與"微服務(wù)治理"的做法相似,每個(gè)微服務(wù)使用單獨(dú)的一個(gè)數(shù)據(jù)庫。如圖:
將不同模塊的數(shù)據(jù)表分庫存儲(chǔ)。模塊間不相互關(guān)聯(lián)查詢
如果有,就需要通過數(shù)據(jù)冗余或者應(yīng)層二次加工來解決。這種業(yè)務(wù)方法和數(shù)據(jù)結(jié)構(gòu)最清晰。但若不能杜絕跨庫關(guān)聯(lián)查詢,宣告此路不同
是基于數(shù)據(jù)庫中的"列"進(jìn)行,某個(gè)表字段較多,可以新建一張擴(kuò)展表,將不經(jīng)常用或字段長度較大的字段拆分出去到擴(kuò)展表中。在字段很多的情況下(例如一個(gè)大表有100多個(gè)字段),通過"大表拆小表",更便于開發(fā)與維護(hù),也能避免跨頁問題,MySQL底層是通過數(shù)據(jù)頁存儲(chǔ)的,一條記錄占用空間過大會(huì)導(dǎo)致跨頁,造成額外的性能開銷。另外數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內(nèi)存中,這樣表中字段長度較短且訪問頻率較高,內(nèi)存能加載更多的數(shù)據(jù),命中率更高,減少了磁盤IO,從而提升了數(shù)據(jù)庫性能。
垂直切分的優(yōu)點(diǎn):
缺點(diǎn):
當(dāng)一個(gè)應(yīng)用難以再細(xì)粒度的垂直切分,或切分后數(shù)據(jù)量行數(shù)巨大,存在單庫讀寫、存儲(chǔ)性能瓶頸,這時(shí)候就需要進(jìn)行水平切分了。
水平切分分為庫內(nèi)分表和分庫分表,是根據(jù)表內(nèi)數(shù)據(jù)內(nèi)在的邏輯關(guān)系,將同一個(gè)表按不同的條件分散到多個(gè)數(shù)據(jù)庫或多個(gè)表中,每個(gè)表中只包含一部分?jǐn)?shù)據(jù),從而使得單個(gè)表的數(shù)據(jù)量變小,達(dá)到分布式的效果。如圖所示:
相對(duì)縱向切分這一將表分類的做法,此法是按表內(nèi)每個(gè)字段的某個(gè)規(guī)則來將數(shù)據(jù)分散存儲(chǔ)于不同的數(shù)據(jù)庫(或不同的表),也就是按照數(shù)行來進(jìn)行切分?jǐn)?shù)據(jù)。
庫內(nèi)分表只解決了單一表數(shù)據(jù)量過大的問題,但沒有將表分布到不同機(jī)器的庫上,因此對(duì)于減輕MySQL數(shù)據(jù)庫的壓力來說,幫助不是很大,大家還是競爭同一個(gè)物理機(jī)的CPU、內(nèi)存、網(wǎng)絡(luò)IO,最好通過分庫分表來解決。
水平切分的優(yōu)點(diǎn):
缺點(diǎn):
水平切分后同一張表會(huì)出現(xiàn)在多個(gè)數(shù)據(jù)庫/表中,每個(gè)庫/表的內(nèi)容不同。幾種典型的數(shù)據(jù)分片規(guī)則為:
按照時(shí)間區(qū)間或ID區(qū)間來切分。例如:按日期將不同月甚至是日的數(shù)據(jù)分散到不同的庫中;將userId為1~9999的記錄分到第一個(gè)庫,10000~20000的分到第二個(gè)庫,以此類推。某種意義上,某些系統(tǒng)中使用的"冷熱數(shù)據(jù)分離",將一些使用較少的歷史數(shù)據(jù)遷移到其他庫中,業(yè)務(wù)功能上只提供熱點(diǎn)數(shù)據(jù)的查詢,也是類似的實(shí)踐。
這樣的優(yōu)點(diǎn)在于:
缺點(diǎn):
一般采用hash取模mod的切分方式,例如:將 Customer 表根據(jù) cusno 字段切分到4個(gè)庫中,余數(shù)為0的放到第一個(gè)庫,余數(shù)為1的放到第二個(gè)庫,以此類推。這樣同一個(gè)用戶的數(shù)據(jù)會(huì)分散到同一個(gè)庫中,如果查詢條件帶有cusno字段,則可明確定位到相應(yīng)庫去查詢。
優(yōu)點(diǎn):
缺點(diǎn):
以上就是MySQL 分表分庫怎么進(jìn)行數(shù)據(jù)切分的詳細(xì)內(nèi)容,更多關(guān)于MySQL 分表分庫進(jìn)行數(shù)據(jù)切分的資料請關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:無錫 迪慶 龍巖 西寧 徐州 南充 麗水 自貢
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 分表分庫怎么進(jìn)行數(shù)據(jù)切分》,本文關(guān)鍵詞 MySQL,分表,分庫,怎么,進(jìn)行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。