MySQL分庫分表的幾種方式
一、為什么要分庫分表
如果一個網(wǎng)站業(yè)務(wù)快速發(fā)展,那這個網(wǎng)站流量也會增加,數(shù)據(jù)的壓力也會隨之而來,比如電商系統(tǒng)來說雙十一大促對訂單數(shù)據(jù)壓力很大,Tps十幾萬并發(fā)量,如果傳統(tǒng)的架構(gòu)(一主多從),主庫容量肯定無法滿足這么高的Tps,業(yè)務(wù)越來越大,單表數(shù)據(jù)超出了數(shù)據(jù)庫支持的容量,持久化磁盤IO,傳統(tǒng)的數(shù)據(jù)庫性能瓶頸,產(chǎn)品經(jīng)理業(yè)務(wù)·必須做,改變程序,數(shù)據(jù)庫刀子切分優(yōu)化。數(shù)據(jù)庫連接數(shù)不夠需要分庫,表的數(shù)據(jù)量大,優(yōu)化后查詢性能還是很低,需要分。
二、什么是分庫分表
- 分庫分表方案是對關(guān)系型數(shù)據(jù)庫數(shù)據(jù)存儲和訪問機(jī)制的一種補(bǔ)充。
- 分庫:將一個庫的數(shù)據(jù)拆分到多個相同的庫中,訪問的時候訪問一個庫
- 分表:把一個表的數(shù)據(jù)放到多個表中,操作對應(yīng)的某個表就行
三、分庫分表的幾種方式
1.垂直拆分
(1) 數(shù)據(jù)庫垂直拆分
根據(jù)業(yè)務(wù)拆分,如圖,電商系統(tǒng),拆分成訂單庫,會員庫,商品庫
(2)表垂直拆分
根據(jù)業(yè)務(wù)去拆分表,如圖,把user表拆分成user_base表和user_info表,use_base負(fù)責(zé)存儲登錄,user_info負(fù)責(zé)存儲基本用戶信息
垂直拆分特點:
- 每個庫(表)的結(jié)構(gòu)都不一樣
- 每個庫(表)的數(shù)據(jù)至少一列一樣
- 每個庫(表)的并集是全量數(shù)據(jù)
垂直拆分優(yōu)缺點
優(yōu)點:
- 拆分后業(yè)務(wù)清晰(專庫專用按業(yè)務(wù)拆分)
- 數(shù)據(jù)維護(hù)簡單,按業(yè)務(wù)不同,業(yè)務(wù)放到不同機(jī)器上
缺點:
- 如果單表的數(shù)據(jù)量,寫讀壓力大
- 受某種業(yè)務(wù)決定,或者被限制,也就是說一個業(yè)務(wù)往往會影響到數(shù)據(jù)庫的瓶頸(性能問題,如雙十一搶購)
- 部分業(yè)務(wù)無法關(guān)聯(lián)join,只能通過java程序接口去調(diào)用,提高了開發(fā)復(fù)雜度
2. 水平拆分
(1) 數(shù)據(jù)庫水平拆分
如圖,按會員庫拆分,拆分成會員1庫,會員2庫,以userId拆分,userId尾號0-5為1庫 6-9為2庫,還有其他方式,進(jìn)行取模,偶數(shù)放到1庫,奇數(shù)放到2庫
(2) 表水平拆分
如圖把users表拆分成users1表和users2表,以userId拆分,進(jìn)行取模,偶數(shù)放到users1表,奇數(shù)放到users2表
水平拆分的其他方式:
- range來分,每個庫一段連續(xù)的數(shù)據(jù),這個一般是按比如時間范圍來的,但是這種一般較少用,因為很容易產(chǎn)生熱點問題,大量的流量都打在最新的數(shù)據(jù)上了,優(yōu)點:擴(kuò)容的時候,就很容易,因為你只要預(yù)備好,給每個月都準(zhǔn)備一個庫就可以了,到了一個新的月份的時候,自然而然,就會寫新的庫了 缺點:大部分的 請求,都是訪問最新的數(shù)據(jù)。實際生產(chǎn)用range,要看場景,你的用戶不是僅僅訪問最新的數(shù)據(jù),而是均勻的訪問現(xiàn)在的數(shù)據(jù)以及歷史的數(shù)據(jù)
- hash分發(fā),優(yōu)點:可以平均分配每個庫的數(shù)據(jù)量和請求壓力 缺點:擴(kuò)容起來比較麻煩,會有一個數(shù)據(jù)遷移的這么一個過程
(3) 水平拆分特點
- 每個庫(表)的結(jié)構(gòu)都一樣
- 每個庫(表)的數(shù)據(jù)都不一樣
- 每個庫(表)的并集是全量數(shù)據(jù)
(4) 水平拆分優(yōu)缺點
優(yōu)點:
- 單庫/單表的數(shù)據(jù)保持在一定量(減少),有助于性能提高
- 提高了系統(tǒng)的穩(wěn)定性和負(fù)載能力
- 拆分表的結(jié)構(gòu)相同,程序改造較少。
缺點:
- 數(shù)據(jù)的擴(kuò)容很有難度維護(hù)量大
- 拆分規(guī)則很難抽象出來
- 分片事務(wù)的一致性問題部分業(yè)務(wù)無法關(guān)聯(lián)join,只能通過java程序接口去調(diào)用
四、分庫分表帶來的問題
- 分布式事務(wù)
- 跨庫join查詢
- 分布式全局唯一id
- 開發(fā)成本 對程序員要求高
五、分庫分表技術(shù)如何選型
(1) 分庫分表的開源框架
- jdbc 直連層:shardingsphere、tddl
- proxy 代理層:mycat,mysql-proxy(360)
jdbc直連層
jdbc直連層又叫jdbc應(yīng)用層,是因為所有分片規(guī)則,所有分片邏輯,包括處理分布式事務(wù) 所有這些問題它都是在應(yīng)用層,所有項目都是由war包構(gòu)成的,所有分片都寫成了jar包,放到了war包里面,java需要虛擬機(jī)去運行的,虛擬機(jī)運行的時候就會把war包里面的字節(jié)文件進(jìn)行classLoder加載到j(luò)vm內(nèi)存中,所有分片邏輯都是基于內(nèi)存方進(jìn)行操作的
(2) proxy代理層
如圖,proxy代理層,所有分片規(guī)則,所有分片邏輯,包括處理分布式事務(wù)都在mycat寫好了,所有分片邏輯都是基于mycat方進(jìn)行操作
(3) jdbc直連層和proxy代理層優(yōu)缺點
- jdbc直連層性能高,只支持java語言,支持跨數(shù)據(jù)庫
- proxy代理層開發(fā)成本低,支持跨語言,不支持跨數(shù)據(jù)庫
到此這篇關(guān)于MySQL分庫分表的幾種方式的文章就介紹到這了,更多相關(guān)MySQL分庫分表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在MySQL執(zhí)行UPDATE語句時遇到的錯誤1175的解決方案
MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句時必須基于主鍵或索引列,或者使用LIMIT限制行數(shù),若SQL語句未滿足這些條件,會觸發(fā)錯誤1175,本文介紹在MySQL執(zhí)行UPDATE語句時遇到的錯誤1175的解決方案,感興趣的朋友一起看看吧2025-02-02最全50個Mysql數(shù)據(jù)庫查詢練習(xí)題
這篇文章主要介紹了最全50個數(shù)據(jù)庫查詢練習(xí)題,Mysql數(shù)據(jù)庫版本,全部都驗證過2020-12-12深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析
本篇文章是對mysql "ON DUPLICATE KEY UPDATE"語法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06MySQL中g(shù)roup by與max()一起使用的坑
最近在做一個項目,發(fā)現(xiàn)用之前SQL語句導(dǎo)出的余額與客戶人員最近消費記錄所顯示的余額不一致,本文就來了解一下這個錯誤,感興趣的可以了解一下2023-08-08淺談innodb的索引頁結(jié)構(gòu),插入緩沖,自適應(yīng)哈希索引
下面小編就為大家?guī)硪黄獪\談innodb的索引頁結(jié)構(gòu),插入緩沖,自適應(yīng)哈希索引。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03Mysql之EXPLAIN顯示using filesort介紹
EXPLAIN 是mysql解釋select查詢的一個關(guān)鍵字,可以很方便的用于調(diào)試2012-02-02MySQL數(shù)據(jù)庫設(shè)置遠(yuǎn)程訪問權(quán)限方法小結(jié)
很多情況下我們需要遠(yuǎn)程連接mysql數(shù)據(jù)庫,那么就可以參考下面的權(quán)限設(shè)置2013-10-10