- 為什么要分庫(kù)分表
隨著業(yè)務(wù)擴(kuò)大怀各,系統(tǒng)訪問(wèn)量增大倔韭,數(shù)據(jù)表數(shù)據(jù)增大,導(dǎo)致數(shù)據(jù)庫(kù)性能出現(xiàn)瓶頸
- 如何分庫(kù)分表
水平分庫(kù)分表瓢对,垂直分庫(kù)分表
垂直分表:將一張表按照字段劃分為多張表
垂直分庫(kù):按照業(yè)務(wù)寿酌,讓不同業(yè)務(wù)的表放在不同的數(shù)據(jù)庫(kù)中
垂直:針對(duì)的是數(shù)據(jù)表結(jié)構(gòu)進(jìn)行切分
水平分表:在同一個(gè)數(shù)據(jù)庫(kù)中,將一張表水平切分為多長(zhǎng)表
水平分庫(kù):將一張表切分成多張表到不同的數(shù)據(jù)庫(kù)中
水平:針對(duì)的是數(shù)據(jù)行進(jìn)行的切分
- 常用的分庫(kù)分表中間件
Sharding-jdbc(原則上不能稱做中間件硕蛹,它是以jar包的形式存在的)醇疼,mycat
- 垂直分表的作用
減少I(mǎi)O帶來(lái)的性能損耗
減少I(mǎi)O鎖表的可能
讓每頁(yè)存儲(chǔ)更多的行數(shù)據(jù)
垂直分表的原則: 讓熱門(mén)數(shù)據(jù)字段單獨(dú)分一張表,讓大字段不經(jīng)常查詢的到另外一張表
- 垂直分庫(kù)的作用
垂直分表只解決了單一表數(shù)據(jù)量過(guò)大的問(wèn)題法焰,但沒(méi)將表分到不同的數(shù)據(jù)庫(kù)中秧荆,因此每個(gè)表還是競(jìng)爭(zhēng)同一個(gè)物理機(jī)的CPU,內(nèi)存埃仪,網(wǎng)絡(luò)IO乙濒,磁盤(pán)
垂直分庫(kù)的原則:按照業(yè)務(wù),讓數(shù)據(jù)庫(kù)中的表分到不同的數(shù)據(jù)庫(kù)中卵蛉,專庫(kù)專用
- 水平分庫(kù)的作用
解決單表數(shù)據(jù)量大訪問(wèn)頻繁的問(wèn)題颁股。前面垂直分庫(kù)分表的策略已經(jīng)不能解決當(dāng)前的問(wèn)題時(shí),需要使用到水平分
水平分庫(kù)的原則:根據(jù)原始表的某個(gè)業(yè)務(wù)ID傻丝,對(duì)ID%庫(kù)的數(shù)量甘有,讓不同的數(shù)據(jù)進(jìn)入到水平切分后不同的庫(kù)中對(duì)應(yīng)的表中。每個(gè)庫(kù)的表結(jié)構(gòu)是一樣的
- 水平分表的作用
解決單表數(shù)據(jù)量過(guò)大的問(wèn)題
水平分表的原則:在同一個(gè)數(shù)據(jù)庫(kù)內(nèi)桑滩,將一張表水平拆分為多張表梧疲,表的數(shù)據(jù)結(jié)構(gòu)不變
- 分庫(kù)分表設(shè)計(jì)的最佳實(shí)踐原則
- 分庫(kù)分表需要解決的問(wèn)題
1.事務(wù)一致性問(wèn)題
分布式事務(wù)
跨結(jié)點(diǎn)關(guān)聯(lián)查詢
跨結(jié)點(diǎn)分頁(yè)、排序
主鍵避重
無(wú)法使用自增主鍵
公共表(多個(gè)表需要用到的表运准,如區(qū)域表)
Sharding-jdbc的功能
功能:
數(shù)據(jù)分片
讀寫(xiě)分離
Sharding-jdbc分表規(guī)則配置
步驟:
- 配置數(shù)據(jù)源
- 配置數(shù)據(jù)表的數(shù)據(jù)節(jié)點(diǎn)
t_order是邏輯表幌氮,sharding_jdbc會(huì)根據(jù)設(shè)置的分片策略,將對(duì)邏輯表操作的sql映射生成在不同的數(shù)據(jù)表的sql并執(zhí)行
- 配置主鍵生成策略
- 配置分表策略:分片鍵和分片算法
Where后的條件如果出現(xiàn)order_id胁澳,會(huì)根據(jù)這個(gè)order_id并通過(guò)分片算法到對(duì)應(yīng)的數(shù)據(jù)表中獲取數(shù)據(jù)
- 打開(kāi)sql日志
- Sharding-jdbc的配置方法
- Properties
- Yml
- @Configuration
- Xml
- Sharding-jdbc的幾個(gè)概念
- 邏輯表
用戶定義的sql操作的表
- 真實(shí)表
Sharding-jdbc根據(jù)分片策略真正執(zhí)行sql操作的表
- 數(shù)據(jù)節(jié)點(diǎn)
某一張真實(shí)表表示一個(gè)節(jié)點(diǎn)
- 綁定表
指分片策略一致的主表和子表该互,例如:商品表和商品明細(xì)表。此時(shí)商品表和商品明細(xì)表之間的關(guān)聯(lián)查詢對(duì)于sharding-jdbc來(lái)說(shuō)不會(huì)出現(xiàn)笛卡爾積關(guān)聯(lián)查詢的問(wèn)題韭畸。因?yàn)槿绻墙壎ū淼脑捰钪牵鼈儗?duì)于同一個(gè)業(yè)務(wù)ID的數(shù)據(jù)肯定是落在各自對(duì)應(yīng)的同一個(gè)真實(shí)表中
- 廣播表
指的是公共表,對(duì)于不同數(shù)據(jù)源中都會(huì)用到的表胰丁,那么sharding-jdbc在操作這個(gè)表的時(shí)候随橘,會(huì)對(duì)所有數(shù)據(jù)源的這個(gè)表執(zhí)行sql
- 分片鍵(分片字段)
- 分片算法
- 分片策略
分片鍵+分片算法
-
自增主鍵生成策略
- Sharding-jdbc的執(zhí)行原理
Sql解析->sql路由->sql改寫(xiě)->sql執(zhí)行->結(jié)果合并
- sql解析
目的:標(biāo)記語(yǔ)法樹(shù)上的哪些結(jié)點(diǎn)可能會(huì)被改寫(xiě)
分為詞法解析和語(yǔ)法解析
詞法解析:解析sql中的關(guān)鍵字
語(yǔ)法解析:將詞法解析的結(jié)果和sql生成語(yǔ)法樹(shù)
分為藍(lán)色ROOT,綠色:關(guān)鍵字锦庸,紅色:變量机蔗,白色:還可以再分子結(jié)點(diǎn)的結(jié)點(diǎn)
- sql路由
目的:把邏輯表的數(shù)據(jù)操作映射為對(duì)數(shù)據(jù)結(jié)點(diǎn)操作的過(guò)程
根據(jù)分片鍵操作類型分類:
1.單片路由:=
2.多片路由:in
3.范圍路由:between
4.廣播路由:不攜帶分片鍵
根據(jù)分片鍵進(jìn)行路由的場(chǎng)景分類:
直接路由
標(biāo)準(zhǔn)路由
笛卡爾路由
全庫(kù)表路由:廣播路由
sql改寫(xiě)
目的1:將對(duì)邏輯表操作的sql,改寫(xiě)為對(duì)真實(shí)表操作的sql
目的2:對(duì)于Group By,order By操作萝嘁,在進(jìn)行結(jié)果歸并的時(shí)候梆掸,如果sql查詢的字段不包含 分組或排序的字段,那么在改寫(xiě)后會(huì)將 原sql查詢的字段增加上 分組或排序的字段牙言。為什么這么做呢酸钦?因?yàn)槿绻麤](méi)有補(bǔ)充的話,兩張表的數(shù)據(jù)進(jìn)行結(jié)果歸并沒(méi)辦法進(jìn)行分組或排序咱枉,因?yàn)槿鄙倥判蛄?/p>
- Sql執(zhí)行
目的:負(fù)責(zé)將路由和改寫(xiě)后的sql發(fā)送到底層數(shù)據(jù)庫(kù)去執(zhí)行
特點(diǎn):自動(dòng)化的平衡數(shù)據(jù)庫(kù)連接資源與執(zhí)行效率卑硫。它會(huì)在 內(nèi)存限制模式和 連接限制模式之間進(jìn)行自適應(yīng)的切換
OLAP:面向分析的系統(tǒng)
OLTP:面向事務(wù)的操作
- 結(jié)果歸并
目的:查詢遍歷,分組庞钢,排序拔恰,聚合的結(jié)果進(jìn)行歸并
歸并的分類:
內(nèi)存歸并
流式歸并
通過(guò)游標(biāo)實(shí)現(xiàn)。先讓每張表查詢的數(shù)據(jù)有序基括,再通過(guò)每張表的游標(biāo)進(jìn)行移動(dòng)來(lái)排序
- 裝飾者歸并
在以前歸并后的結(jié)果的基礎(chǔ)上做進(jìn)一步增強(qiáng)颜懊,使用到了裝飾者模式
- Sharding-jdbc的執(zhí)行原理總結(jié)
Sharding-jdbc水平分庫(kù)配置規(guī)則
配置多個(gè)數(shù)據(jù)源
- 配置分庫(kù)策略:分庫(kù)鍵和分庫(kù)算法
分片策略:inline
- 配置數(shù)據(jù)節(jié)點(diǎn)
- Sharding-jdbc的優(yōu)化
查詢的時(shí)候盡量使用到分片鍵,避免廣播路由產(chǎn)生額外的sql查詢
Sharding-jdbc垂直分庫(kù)配置規(guī)則
配置數(shù)據(jù)源
-
配置數(shù)據(jù)節(jié)點(diǎn)
-
配置分表策略
Sharding-jdbc公共表
配置公共表
Sharding-jdbc讀寫(xiě)分離
修改mysql的配置文件
配置從庫(kù)數(shù)據(jù)源
- 配置主庫(kù)從庫(kù)邏輯數(shù)據(jù)源
-
配置主庫(kù)從庫(kù)數(shù)據(jù)節(jié)點(diǎn)