溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Mysql分庫(kù)分表的概念

發(fā)布時(shí)間:2021-09-16 07:07:02 來(lái)源:億速云 閱讀:192 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“Mysql分庫(kù)分表的概念”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Mysql分庫(kù)分表的概念”吧!

分庫(kù)分表的方式一般有兩種:垂直拆分和水平拆分。接下來(lái)我們可以分別看看這兩種分庫(kù)分表方式:
垂直拆分
垂直拆分主要有兩種:垂直分庫(kù)和垂直分表。

垂直分庫(kù):
垂直分庫(kù)其實(shí)邏輯上會(huì)更容易理解,比如目前我數(shù)據(jù)庫(kù)有用戶相關(guān)的表如用戶表,積分表,實(shí)名認(rèn)證表,還有訂單相關(guān)的比如商品表,拼團(tuán)表,還有商品相關(guān)的商品表。如果全部表全部放在同一個(gè)數(shù)據(jù)庫(kù),由于數(shù)據(jù)庫(kù)連接的匱乏以及磁盤(pán)IO等影響,所以性能肯定會(huì)收到一定的影響。這時(shí)候我們可以可以將用戶相關(guān)的放在user數(shù)據(jù)庫(kù),商品相關(guān)的放在goods數(shù)據(jù)庫(kù),訂單相關(guān)的放在order數(shù)據(jù)庫(kù)。然后不同的數(shù)據(jù)庫(kù)存放在不同的服務(wù)器上,這樣還可以避免因?yàn)橛脩袅吭絹?lái)越多導(dǎo)致數(shù)據(jù)庫(kù)性能受到服務(wù)器瓶頸的影響。所以說(shuō)分庫(kù)實(shí)際上就是在多個(gè)服務(wù)器搭建多個(gè)不同的數(shù)據(jù)庫(kù),然后按照不同的業(yè)務(wù)邏輯將不同的表存放在不同的數(shù)據(jù)庫(kù)。  
垂直分表:
垂直分表主要是表中數(shù)據(jù)列成百上千的數(shù)據(jù)表使用的,使用的方案是創(chuàng)建輔助表,將表中數(shù)據(jù)量較大或者不常用的數(shù)據(jù)庫(kù)移動(dòng)到輔助表,常用的字段留在原表中,這樣就可以避免我們?cè)诓樵?xún)大表的時(shí)候由于不常用的大字段影響查詢(xún)的性能。  

水平拆分
水平拆分也有兩種:水平分表和水平分庫(kù)分表。

水平分表:
水平分表和垂直分表區(qū)別在于垂直分表針對(duì)的是列,將不常用的列拆分到輔助表。而水平分表針對(duì)的是表,在同一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建多張一樣的表,比如我們?cè)?strong>order數(shù)據(jù)庫(kù)中創(chuàng)建三張訂單表order1,order2order3,然后插入訂單時(shí)將id對(duì)3取余,根據(jù)不同的值存入不同的訂單表,但是由于水平分表是將數(shù)據(jù)表存放在同一個(gè)數(shù)據(jù)庫(kù),水平分表可以降低單標(biāo)的數(shù)據(jù)量,有助于提高查詢(xún)效率。如果業(yè)務(wù)量很大一樣會(huì)受到服務(wù)器IO的瓶頸,所以我們一般更經(jīng)常使用的還是水平分庫(kù)分表。
水平分庫(kù)分表:  
水平分庫(kù)分表實(shí)際上就是在多臺(tái)不同的機(jī)器分別創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表,比如訂單表我們可以在三臺(tái)不同的機(jī)器上分別創(chuàng)建order數(shù)據(jù)庫(kù)和order數(shù)據(jù)表,然后根據(jù)一定的邏輯將不同的數(shù)據(jù)存放到不同機(jī)器的數(shù)據(jù)庫(kù)中。一般來(lái)說(shuō)水平分庫(kù)分表主要有以下幾種拆分規(guī)則:
  • 范圍拆分:比如訂單表通過(guò)id拆分,id1100000在服務(wù)器aorder數(shù)據(jù)庫(kù),id100001200000存放在服務(wù)器border數(shù)據(jù)庫(kù),以此類(lèi)推。

  • 地理拆分:將訂單表按照不同地區(qū)將表中的數(shù)據(jù)拆分到不同服務(wù)器的order數(shù)據(jù)庫(kù)中存儲(chǔ)。比如可以按照省份來(lái)進(jìn)行拆分。

  • 取模拆分:取模就是剛才水平分表講到的比如有三個(gè)訂單表,可以將id對(duì)3取余,但是區(qū)別在于水平分庫(kù)分表是將同樣的數(shù)據(jù)庫(kù)和數(shù)據(jù)表存放在不同機(jī)器,所以說(shuō)可以有效緩解單機(jī)瓶頸問(wèn)題。

  • 時(shí)間拆分:根據(jù)時(shí)間來(lái)拆分表中的數(shù)據(jù),可以將表中創(chuàng)建時(shí)間超過(guò)一年的數(shù)據(jù)拆分到其他數(shù)據(jù)庫(kù)的order數(shù)據(jù)庫(kù)存儲(chǔ),原表中只保留被查詢(xún)概率較高的數(shù)據(jù),而這部分?jǐn)?shù)據(jù)往往都是近期才創(chuàng)建的,所以可以通過(guò)時(shí)間拆分實(shí)現(xiàn)冷熱數(shù)據(jù)分離。

分區(qū)

分區(qū)是什么意思呢?分區(qū)實(shí)際上是指同一個(gè)數(shù)據(jù)表中不同行的數(shù)據(jù)記錄到不同的分區(qū)中,每個(gè)分區(qū)都有一個(gè).idb文件,所以說(shuō)分區(qū)可以幫助我們將一個(gè)數(shù)據(jù)表拆分成幾個(gè)更小的部分。Mysql只支持局部索引分區(qū)不支持全局分區(qū),mysql每一個(gè)分區(qū)既保存了數(shù)據(jù),又存放了索引。MySQL分區(qū)主要分為以下幾種:

  • RANGE分區(qū):RANGE分區(qū)主要用于日期列的分區(qū),是基于連續(xù)區(qū)間的列值來(lái)進(jìn)行分區(qū)的。RANGE分區(qū)也是最常用的分區(qū)方式。

  • LIST分區(qū):LIST分區(qū)列的值是散列的,也正是由于分區(qū)列的值是散列的所以需要手動(dòng)定義分區(qū)列的值。

  • HASH分區(qū):HASH分區(qū)就是通過(guò)自定義算法將數(shù)據(jù)均勻分布到不同分區(qū),保證所有分區(qū)中數(shù)據(jù)大致相同。HASH分區(qū)只支持整數(shù)分區(qū)。

  • KEY分區(qū):key分區(qū)使用數(shù)據(jù)庫(kù)自帶函數(shù)進(jìn)行分區(qū)。KEY分區(qū)可支持BLOBTEXT列之外的數(shù)據(jù)列分區(qū)。


分區(qū)注意點(diǎn)
分區(qū)主要注意一點(diǎn),如果要分區(qū)的表有主鍵或唯一鍵,則分區(qū)表的主鍵/唯一鍵必須包含分區(qū)鍵。分區(qū)的意義在于將一張大表根據(jù)分區(qū)條件分割成幾個(gè)小表,但是對(duì)于數(shù)據(jù)來(lái)說(shuō)仍然是一張表,可以改善大表的可伸縮性,可管理性,還可以提高數(shù)據(jù)庫(kù)的效率。  

分區(qū)的優(yōu)點(diǎn)

  • 與數(shù)據(jù)存放在單個(gè)磁盤(pán)相比,可以存儲(chǔ)更多的數(shù)據(jù)。

  • 對(duì)于那些已經(jīng)失效的數(shù)據(jù),通??梢酝ㄟ^(guò)刪除對(duì)應(yīng)的分區(qū),來(lái)實(shí)現(xiàn)刪除數(shù)據(jù),這樣比delete效率更高。

  • 一些查詢(xún)可以得到極大的優(yōu)化,滿足一個(gè)給定WHERE語(yǔ)句的數(shù)據(jù)可以只保存在一個(gè)分區(qū)內(nèi),這樣在查找時(shí)就不用查找其他剩余的分區(qū)。

  • 涉及聚合函數(shù)的查詢(xún),可以進(jìn)行并行處理。意味著聚合函數(shù)查詢(xún)可以在每個(gè)分區(qū)上同時(shí)進(jìn)行,最終結(jié)果只需通過(guò)總計(jì)所有分區(qū)得到的結(jié)果。


分庫(kù)分表產(chǎn)生的問(wèn)題  
分庫(kù)分表可以一定程度去除數(shù)據(jù)庫(kù)的瓶頸,但是不可避免的分庫(kù)分表會(huì)帶來(lái)一部分問(wèn)題,分庫(kù)分表主要有兩個(gè)問(wèn)題:聯(lián)表查詢(xún)join操作困難和分布式事務(wù)的問(wèn)題。  
聯(lián)表查詢(xún)
我們一開(kāi)始單庫(kù)多表的情況下使用join聯(lián)表操作是非常簡(jiǎn)單的,使用一條簡(jiǎn)單的sql語(yǔ)句配上join就可以得到我們需要的結(jié)果,但是分庫(kù)之后我們可能一次查詢(xún)無(wú)法完成,我們可能需要先去服務(wù)器a查詢(xún)用戶信息,再去服務(wù)器b, c, d分別查詢(xún)訂單信息才能完成我們的聯(lián)表查詢(xún)功能,聯(lián)表查詢(xún)功能我覺(jué)得比較適合的一個(gè)邏輯是分別查詢(xún)出我們需要的數(shù)據(jù),然后代碼方面在service層負(fù)責(zé)組裝所有數(shù)據(jù),最后再返還給客戶端,這樣雖然比較復(fù)雜,但是數(shù)據(jù)庫(kù)的性能可以得到最大化。  

分布式事務(wù)
進(jìn)行分庫(kù)操作之后,事務(wù)操作就變成分布式事務(wù)了,而之前在談Redis的時(shí)候特提到過(guò)分布式,我們都知道涉及到分布式邏輯都是比較復(fù)雜的,而且如果使用Mysql自帶的分布式事務(wù)管理功能會(huì)導(dǎo)致性能大大降低,大概是單庫(kù)的一成左右性能,所以方案一般有兩種:使用分布式事務(wù)中間件比如Mycat或者在代碼中業(yè)務(wù)邏輯進(jìn)行控制,不過(guò)如果在代碼中控制,可能會(huì)使系統(tǒng)更加復(fù)雜,可維護(hù)性比較低。  

感謝各位的閱讀,以上就是“Mysql分庫(kù)分表的概念”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Mysql分庫(kù)分表的概念這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI