最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 分表分庫怎么進(jìn)行數(shù)據(jù)切分

 更新時(shí)間:2021年03月22日 11:56:47   作者:智哥  
這篇文章主要介紹了MySQL 分表分庫怎么進(jìn)行數(shù)據(jù)切分,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下

關(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ù)其切分類型,可以分為兩種方式:垂直(縱向)切分和水平(橫向)切分。

1.垂直(縱向)切分

垂直切分常見有垂直分庫和垂直分表兩種。

1.1 垂直分庫 

就是根據(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)查詢,宣告此路不同

1.2 垂直分表 

是基于數(shù)據(jù)庫中的"列"進(jìn)行,某個(gè)表字段較多,可以新建一張擴(kuò)展表,將不經(jīng)常用或字段長(zhǎng)度較大的字段拆分出去到擴(kuò)展表中。在字段很多的情況下(例如一個(gè)大表有100多個(gè)字段),通過"大表拆小表",更便于開發(fā)與維護(hù),也能避免跨頁問題,MySQL底層是通過數(shù)據(jù)頁存儲(chǔ)的,一條記錄占用空間過大會(huì)導(dǎo)致跨頁,造成額外的性能開銷。另外數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內(nèi)存中,這樣表中字段長(zhǎng)度較短且訪問頻率較高,內(nèi)存能加載更多的數(shù)據(jù),命中率更高,減少了磁盤IO,從而提升了數(shù)據(jù)庫性能。

垂直切分的優(yōu)點(diǎn):

  • 解決業(yè)務(wù)系統(tǒng)層面的耦合,業(yè)務(wù)清晰
  • 與微服務(wù)的治理類似,也能對(duì)不同業(yè)務(wù)的數(shù)據(jù)進(jìn)行分級(jí)管理、維護(hù)、監(jiān)控、擴(kuò)展等
  • 高并發(fā)場(chǎng)景下,垂直切分一定程度的提升IO、數(shù)據(jù)庫連接數(shù)、單機(jī)硬件資源的瓶頸

缺點(diǎn):

  • 部分表無法join,只能通過接口聚合方式解決,提升了開發(fā)的復(fù)雜度
  • 分布式事務(wù)處理復(fù)雜
  • 依然存在單表數(shù)據(jù)量過大的問題(需要水平切分)

2. 水平(橫向)切分

當(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ù)庫的壓力來說,幫助不是很大,大家還是競(jìng)爭(zhēng)同一個(gè)物理機(jī)的CPU、內(nèi)存、網(wǎng)絡(luò)IO,最好通過分庫分表來解決。

水平切分的優(yōu)點(diǎn):

  • 不存在單庫數(shù)據(jù)量過大、高并發(fā)的性能瓶頸,提升系統(tǒng)穩(wěn)定性和負(fù)載能力
  • 應(yīng)用端改造較小,不需要拆分業(yè)務(wù)模塊

缺點(diǎn):

  • 跨分片的事務(wù)一致性難以保證
  • 跨庫的join關(guān)聯(lián)查詢性能較差
  • 數(shù)據(jù)多次擴(kuò)展難度和維護(hù)量極大

水平切分后同一張表會(huì)出現(xiàn)在多個(gè)數(shù)據(jù)庫/表中,每個(gè)庫/表的內(nèi)容不同。幾種典型的數(shù)據(jù)分片規(guī)則為:

2.1 根據(jù)數(shù)值范圍

按照時(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)在于:

  • 單表大小可控
  • 天然便于水平擴(kuò)展,后期如果想對(duì)整個(gè)分片集群擴(kuò)容時(shí),只需要添加節(jié)點(diǎn)即可,無需對(duì)其他分片的數(shù)據(jù)進(jìn)行遷移
  • 使用分片字段進(jìn)行范圍查找時(shí),連續(xù)分片可快速定位分片進(jìn)行快速查詢,有效避免跨分片查詢的問題。

缺點(diǎn):

  • 熱點(diǎn)數(shù)據(jù)成為性能瓶頸。連續(xù)分片可能存在數(shù)據(jù)熱點(diǎn),例如按時(shí)間字段分片,有些分片存儲(chǔ)最近時(shí)間段內(nèi)的數(shù)據(jù),可能會(huì)被頻繁的讀寫,而有些分片存儲(chǔ)的歷史數(shù)據(jù),則很少被查詢

2.2 根據(jù)數(shù)值取模

一般采用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):

  • 數(shù)據(jù)分片相對(duì)比較均勻,不容易出現(xiàn)熱點(diǎn)和并發(fā)訪問的瓶頸

缺點(diǎn):

  • 后期分片集群擴(kuò)容時(shí),需要遷移舊的數(shù)據(jù)(使用一致性hash算法能較好的避免這個(gè)問題)
  • 容易面臨跨分片查詢的復(fù)雜問題。比如上例中,如果頻繁用到的查詢條件中不帶cusno時(shí),將會(huì)導(dǎo)致無法定位數(shù)據(jù)庫,從而需要同時(shí)向4個(gè)庫發(fā)起查詢,再在內(nèi)存中合并數(shù)據(jù),取最小集返回給應(yīng)用,分庫反而成為拖累。

以上就是MySQL 分表分庫怎么進(jìn)行數(shù)據(jù)切分的詳細(xì)內(nèi)容,更多關(guān)于MySQL 分表分庫進(jìn)行數(shù)據(jù)切分的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql5.7版本因?yàn)閟ql_mode設(shè)置導(dǎo)致的問題以及解決

    mysql5.7版本因?yàn)閟ql_mode設(shè)置導(dǎo)致的問題以及解決

    這篇文章主要介紹了mysql5.7版本因?yàn)閟ql_mode設(shè)置導(dǎo)致的問題以及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • mysql如何查詢兩個(gè)日期之間最大的連續(xù)登錄天數(shù)

    mysql如何查詢兩個(gè)日期之間最大的連續(xù)登錄天數(shù)

    在現(xiàn)在的很多網(wǎng)站中都有這樣一個(gè)功能。記錄用戶的連續(xù)登陸天數(shù),所謂的連續(xù)在線是指相鄰兩天都登錄過,不一定一直在線,但是只要有過登錄即可。這篇文章主要介紹的是利用sql語句如何查詢?cè)趦蓚€(gè)日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來一起看看吧。
    2016-10-10
  • mysql 批量給數(shù)據(jù)表和字段添加注釋

    mysql 批量給數(shù)據(jù)表和字段添加注釋

    在MySQL中,添加注釋可以幫助人們更好地理解和管理數(shù)據(jù)庫,本文就介紹了mysql 批量給數(shù)據(jù)表和字段添加注釋,感興趣的可以了解一下
    2023-08-08
  • MySQL數(shù)據(jù)庫維護(hù)中監(jiān)控所用到的常用命令

    MySQL數(shù)據(jù)庫維護(hù)中監(jiān)控所用到的常用命令

    這篇文章主要介紹額MySQL監(jiān)控時(shí)常用的的幾個(gè)MySQL命令,需要的朋友可以收藏下
    2013-08-08
  • MySQL使用索引合并(Index?Merge)提高查詢效率

    MySQL使用索引合并(Index?Merge)提高查詢效率

    本文介紹了索引合并(Index?Merge)的實(shí)現(xiàn)原理、場(chǎng)景約束與通過案例驗(yàn)證的優(yōu)缺點(diǎn),在實(shí)際使用中,當(dāng)查詢條件列較多且無法使用聯(lián)合索引時(shí),就可以考慮使用索引合并,利用多個(gè)索引加速查詢,但要注意,索引合并并非在任何場(chǎng)景下均具有較好的效果,需要結(jié)合具體情況選擇
    2024-07-07
  • Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理(復(fù)制目錄或mysqldump備份)

    Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理(復(fù)制目錄或mysqldump備份)

    Windows下實(shí)現(xiàn)MySQL自動(dòng)備份的批處理,新建目錄并復(fù)制壓縮,結(jié)合windows計(jì)劃任務(wù)方便實(shí)現(xiàn)每天的自動(dòng)備份
    2012-05-05
  • MySQL中的時(shí)區(qū)設(shè)置方式

    MySQL中的時(shí)區(qū)設(shè)置方式

    這篇文章主要介紹了MySQL中的時(shí)區(qū)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì)

    mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì)

    這篇文章介紹了mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Mysql帶And關(guān)鍵字的多條件查詢語句

    Mysql帶And關(guān)鍵字的多條件查詢語句

    MySQL帶AND關(guān)鍵字的多條件查詢,MySQL中,使用AND關(guān)鍵字,可以連接兩個(gè)或者多個(gè)查詢條件,只有滿足所有條件的記錄,才會(huì)被返回
    2017-07-07
  • MySQL將多條數(shù)據(jù)合并成一條的完整代碼示例

    MySQL將多條數(shù)據(jù)合并成一條的完整代碼示例

    我們?cè)诓僮鲾?shù)據(jù)的時(shí)候,有時(shí)候需要把多行數(shù)據(jù),拼接成一行,下面這篇文章主要給大家介紹了關(guān)于MySQL將多條數(shù)據(jù)合并成一條的完整代碼示例,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05

最新評(píng)論

广州市| 江陵县| 新闻| 连江县| 哈巴河县| 洪江市| 洛宁县| 石狮市| 南召县| 会昌县| 湖口县| 通城县| 蛟河市| 元朗区| 昌黎县| 宾阳县| 太湖县| 襄汾县| 六盘水市| 平远县| 永清县| 剑阁县| 含山县| 肃南| 托克逊县| 木兰县| 岳池县| 武邑县| 乐陵市| 黔西县| 山西省| 宝丰县| 邮箱| 开封县| 增城市| 东丽区| 高安市| 习水县| 高陵县| 河西区| 东港市|