MySQL分庫(kù)分表的幾種方式
一、為什么要分庫(kù)分表
如果一個(gè)網(wǎng)站業(yè)務(wù)快速發(fā)展,那這個(gè)網(wǎng)站流量也會(huì)增加,數(shù)據(jù)的壓力也會(huì)隨之而來(lái),比如電商系統(tǒng)來(lái)說(shuō)雙十一大促對(duì)訂單數(shù)據(jù)壓力很大,Tps十幾萬(wàn)并發(fā)量,如果傳統(tǒng)的架構(gòu)(一主多從),主庫(kù)容量肯定無(wú)法滿足這么高的Tps,業(yè)務(wù)越來(lái)越大,單表數(shù)據(jù)超出了數(shù)據(jù)庫(kù)支持的容量,持久化磁盤(pán)IO,傳統(tǒng)的數(shù)據(jù)庫(kù)性能瓶頸,產(chǎn)品經(jīng)理業(yè)務(wù)·必須做,改變程序,數(shù)據(jù)庫(kù)刀子切分優(yōu)化。數(shù)據(jù)庫(kù)連接數(shù)不夠需要分庫(kù),表的數(shù)據(jù)量大,優(yōu)化后查詢性能還是很低,需要分。
二、什么是分庫(kù)分表
- 分庫(kù)分表方案是對(duì)關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)和訪問(wèn)機(jī)制的一種補(bǔ)充。
- 分庫(kù):將一個(gè)庫(kù)的數(shù)據(jù)拆分到多個(gè)相同的庫(kù)中,訪問(wèn)的時(shí)候訪問(wèn)一個(gè)庫(kù)
- 分表:把一個(gè)表的數(shù)據(jù)放到多個(gè)表中,操作對(duì)應(yīng)的某個(gè)表就行
三、分庫(kù)分表的幾種方式
1.垂直拆分
(1) 數(shù)據(jù)庫(kù)垂直拆分
根據(jù)業(yè)務(wù)拆分,如圖,電商系統(tǒng),拆分成訂單庫(kù),會(huì)員庫(kù),商品庫(kù)
(2)表垂直拆分
根據(jù)業(yè)務(wù)去拆分表,如圖,把user表拆分成user_base表和user_info表,use_base負(fù)責(zé)存儲(chǔ)登錄,user_info負(fù)責(zé)存儲(chǔ)基本用戶信息
垂直拆分特點(diǎn):
- 每個(gè)庫(kù)(表)的結(jié)構(gòu)都不一樣
- 每個(gè)庫(kù)(表)的數(shù)據(jù)至少一列一樣
- 每個(gè)庫(kù)(表)的并集是全量數(shù)據(jù)
垂直拆分優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 拆分后業(yè)務(wù)清晰(專庫(kù)專用按業(yè)務(wù)拆分)
- 數(shù)據(jù)維護(hù)簡(jiǎn)單,按業(yè)務(wù)不同,業(yè)務(wù)放到不同機(jī)器上
缺點(diǎn):
- 如果單表的數(shù)據(jù)量,寫(xiě)讀壓力大
- 受某種業(yè)務(wù)決定,或者被限制,也就是說(shuō)一個(gè)業(yè)務(wù)往往會(huì)影響到數(shù)據(jù)庫(kù)的瓶頸(性能問(wèn)題,如雙十一搶購(gòu))
- 部分業(yè)務(wù)無(wú)法關(guān)聯(lián)join,只能通過(guò)java程序接口去調(diào)用,提高了開(kāi)發(fā)復(fù)雜度
2. 水平拆分
(1) 數(shù)據(jù)庫(kù)水平拆分
如圖,按會(huì)員庫(kù)拆分,拆分成會(huì)員1庫(kù),會(huì)員2庫(kù),以u(píng)serId拆分,userId尾號(hào)0-5為1庫(kù) 6-9為2庫(kù),還有其他方式,進(jìn)行取模,偶數(shù)放到1庫(kù),奇數(shù)放到2庫(kù)
(2) 表水平拆分
如圖把users表拆分成users1表和users2表,以u(píng)serId拆分,進(jìn)行取模,偶數(shù)放到users1表,奇數(shù)放到users2表
水平拆分的其他方式:
- range來(lái)分,每個(gè)庫(kù)一段連續(xù)的數(shù)據(jù),這個(gè)一般是按比如時(shí)間范圍來(lái)的,但是這種一般較少用,因?yàn)楹苋菀桩a(chǎn)生熱點(diǎn)問(wèn)題,大量的流量都打在最新的數(shù)據(jù)上了,優(yōu)點(diǎn):擴(kuò)容的時(shí)候,就很容易,因?yàn)槟阒灰A(yù)備好,給每個(gè)月都準(zhǔn)備一個(gè)庫(kù)就可以了,到了一個(gè)新的月份的時(shí)候,自然而然,就會(huì)寫(xiě)新的庫(kù)了 缺點(diǎn):大部分的 請(qǐng)求,都是訪問(wèn)最新的數(shù)據(jù)。實(shí)際生產(chǎn)用range,要看場(chǎng)景,你的用戶不是僅僅訪問(wèn)最新的數(shù)據(jù),而是均勻的訪問(wèn)現(xiàn)在的數(shù)據(jù)以及歷史的數(shù)據(jù)
- hash分發(fā),優(yōu)點(diǎn):可以平均分配每個(gè)庫(kù)的數(shù)據(jù)量和請(qǐng)求壓力 缺點(diǎn):擴(kuò)容起來(lái)比較麻煩,會(huì)有一個(gè)數(shù)據(jù)遷移的這么一個(gè)過(guò)程
(3) 水平拆分特點(diǎn)
- 每個(gè)庫(kù)(表)的結(jié)構(gòu)都一樣
- 每個(gè)庫(kù)(表)的數(shù)據(jù)都不一樣
- 每個(gè)庫(kù)(表)的并集是全量數(shù)據(jù)
(4) 水平拆分優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 單庫(kù)/單表的數(shù)據(jù)保持在一定量(減少),有助于性能提高
- 提高了系統(tǒng)的穩(wěn)定性和負(fù)載能力
- 拆分表的結(jié)構(gòu)相同,程序改造較少。
缺點(diǎn):
- 數(shù)據(jù)的擴(kuò)容很有難度維護(hù)量大
- 拆分規(guī)則很難抽象出來(lái)
- 分片事務(wù)的一致性問(wèn)題部分業(yè)務(wù)無(wú)法關(guān)聯(lián)join,只能通過(guò)java程序接口去調(diào)用
四、分庫(kù)分表帶來(lái)的問(wèn)題
- 分布式事務(wù)
- 跨庫(kù)join查詢
- 分布式全局唯一id
- 開(kāi)發(fā)成本 對(duì)程序員要求高
五、分庫(kù)分表技術(shù)如何選型
(1) 分庫(kù)分表的開(kāi)源框架
- jdbc 直連層:shardingsphere、tddl
- proxy 代理層:mycat,mysql-proxy(360)
jdbc直連層
jdbc直連層又叫jdbc應(yīng)用層,是因?yàn)樗蟹制?guī)則,所有分片邏輯,包括處理分布式事務(wù) 所有這些問(wèn)題它都是在應(yīng)用層,所有項(xiàng)目都是由war包構(gòu)成的,所有分片都寫(xiě)成了jar包,放到了war包里面,java需要虛擬機(jī)去運(yùn)行的,虛擬機(jī)運(yùn)行的時(shí)候就會(huì)把war包里面的字節(jié)文件進(jìn)行classLoder加載到j(luò)vm內(nèi)存中,所有分片邏輯都是基于內(nèi)存方進(jìn)行操作的
(2) proxy代理層
如圖,proxy代理層,所有分片規(guī)則,所有分片邏輯,包括處理分布式事務(wù)都在mycat寫(xiě)好了,所有分片邏輯都是基于mycat方進(jìn)行操作
(3) jdbc直連層和proxy代理層優(yōu)缺點(diǎn)
- jdbc直連層性能高,只支持java語(yǔ)言,支持跨數(shù)據(jù)庫(kù)
- proxy代理層開(kāi)發(fā)成本低,支持跨語(yǔ)言,不支持跨數(shù)據(jù)庫(kù)
到此這篇關(guān)于MySQL分庫(kù)分表的幾種方式的文章就介紹到這了,更多相關(guān)MySQL分庫(kù)分表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安裝MySQL 5.7出現(xiàn)報(bào)錯(cuò):unknown variable ‘mysqlx_port
這篇文章主要介紹了安裝MySQL 5.7出現(xiàn)報(bào)錯(cuò):unknown variable ‘mysqlx_port=0.0‘的解決方法,文中通過(guò)圖文結(jié)合的方式介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06幾個(gè)縮減MySQL以節(jié)省磁盤(pán)空間的建議
這篇文章主要介紹了幾個(gè)縮減MySQL以節(jié)省磁盤(pán)空間的建議,主要從表結(jié)構(gòu)和存儲(chǔ)內(nèi)容兩個(gè)方面來(lái)談減容,需要的朋友可以參考下2015-05-05MySQL(基于GTID方式)實(shí)現(xiàn)主從復(fù)制和單主復(fù)制詳細(xì)教程
在分布式數(shù)據(jù)庫(kù)系統(tǒng)中,主從復(fù)制是實(shí)現(xiàn)高可用性和數(shù)據(jù)冗余的重要手段,基于GTID的復(fù)制模式可以提供更強(qiáng)的復(fù)制一致性和簡(jiǎn)化故障轉(zhuǎn)移過(guò)程,本文將詳細(xì)介紹如何配置單主復(fù)制的GTID模式,以便在MySQL數(shù)據(jù)庫(kù)中實(shí)現(xiàn)穩(wěn)定可靠的數(shù)據(jù)復(fù)制,需要的朋友可以參考下2024-07-07Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法
這篇文章主要介紹了Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法,本文使用Like和find_in_set兩種方法實(shí)現(xiàn),需要的朋友可以參考下2015-01-01