- 為什么要分庫分表
隨著業(yè)務(wù)擴(kuò)大,系統(tǒng)訪問量增大,數(shù)據(jù)表數(shù)據(jù)增大,導(dǎo)致數(shù)據(jù)庫性能出現(xiàn)瓶頸
- 如何分庫分表
水平分庫分表,垂直分庫分表
垂直分表:將一張表按照字段劃分為多張表
垂直分庫:按照業(yè)務(wù),讓不同業(yè)務(wù)的表放在不同的數(shù)據(jù)庫中
垂直:針對的是數(shù)據(jù)表結(jié)構(gòu)進(jìn)行切分
水平分表:在同一個(gè)數(shù)據(jù)庫中,將一張表水平切分為多長表
水平分庫:將一張表切分成多張表到不同的數(shù)據(jù)庫中
水平:針對的是數(shù)據(jù)行進(jìn)行的切分
- 常用的分庫分表中間件
Sharding-jdbc(原則上不能稱做中間件,它是以jar包的形式存在的),mycat
- 垂直分表的作用
減少IO帶來的性能損耗
減少IO鎖表的可能
讓每頁存儲(chǔ)更多的行數(shù)據(jù)

垂直分表的原則: 讓熱門數(shù)據(jù)字段單獨(dú)分一張表,讓大字段不經(jīng)常查詢的到另外一張表
- 垂直分庫的作用
垂直分表只解決了單一表數(shù)據(jù)量過大的問題,但沒將表分到不同的數(shù)據(jù)庫中,因此每個(gè)表還是競爭同一個(gè)物理機(jī)的CPU,內(nèi)存,網(wǎng)絡(luò)IO,磁盤
垂直分庫的原則:按照業(yè)務(wù),讓數(shù)據(jù)庫中的表分到不同的數(shù)據(jù)庫中,專庫專用

- 水平分庫的作用
解決單表數(shù)據(jù)量大訪問頻繁的問題。前面垂直分庫分表的策略已經(jīng)不能解決當(dāng)前的問題時(shí),需要使用到水平分

水平分庫的原則:根據(jù)原始表的某個(gè)業(yè)務(wù)ID,對ID%庫的數(shù)量,讓不同的數(shù)據(jù)進(jìn)入到水平切分后不同的庫中對應(yīng)的表中。每個(gè)庫的表結(jié)構(gòu)是一樣的
- 水平分表的作用
解決單表數(shù)據(jù)量過大的問題

水平分表的原則:在同一個(gè)數(shù)據(jù)庫內(nèi),將一張表水平拆分為多張表,表的數(shù)據(jù)結(jié)構(gòu)不變
- 分庫分表設(shè)計(jì)的最佳實(shí)踐原則

- 分庫分表需要解決的問題

1.事務(wù)一致性問題
分布式事務(wù)
跨結(jié)點(diǎn)關(guān)聯(lián)查詢
跨結(jié)點(diǎn)分頁、排序
主鍵避重
無法使用自增主鍵
公共表(多個(gè)表需要用到的表,如區(qū)域表)
Sharding-jdbc的功能
功能:
數(shù)據(jù)分片
讀寫分離
Sharding-jdbc分表規(guī)則配置
步驟:
- 配置數(shù)據(jù)源

- 配置數(shù)據(jù)表的數(shù)據(jù)節(jié)點(diǎn)

t_order是邏輯表,sharding_jdbc會(huì)根據(jù)設(shè)置的分片策略,將對邏輯表操作的sql映射生成在不同的數(shù)據(jù)表的sql并執(zhí)行
- 配置主鍵生成策略

- 配置分表策略:分片鍵和分片算法

Where后的條件如果出現(xiàn)order_id,會(huì)根據(jù)這個(gè)order_id并通過分片算法到對應(yīng)的數(shù)據(jù)表中獲取數(shù)據(jù)
- 打開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)查詢對于sharding-jdbc來說不會(huì)出現(xiàn)笛卡爾積關(guān)聯(lián)查詢的問題。因?yàn)槿绻墙壎ū淼脑挘鼈儗τ谕粋€(gè)業(yè)務(wù)ID的數(shù)據(jù)肯定是落在各自對應(yīng)的同一個(gè)真實(shí)表中
- 廣播表

指的是公共表,對于不同數(shù)據(jù)源中都會(huì)用到的表,那么sharding-jdbc在操作這個(gè)表的時(shí)候,會(huì)對所有數(shù)據(jù)源的這個(gè)表執(zhí)行sql
- 分片鍵(分片字段)

- 分片算法

- 分片策略
分片鍵+分片算法

-
自增主鍵生成策略
- Sharding-jdbc的執(zhí)行原理
Sql解析->sql路由->sql改寫->sql執(zhí)行->結(jié)果合并
- sql解析
目的:標(biāo)記語法樹上的哪些結(jié)點(diǎn)可能會(huì)被改寫
分為詞法解析和語法解析
詞法解析:解析sql中的關(guān)鍵字
語法解析:將詞法解析的結(jié)果和sql生成語法樹
分為藍(lán)色ROOT,綠色:關(guān)鍵字,紅色:變量,白色:還可以再分子結(jié)點(diǎn)的結(jié)點(diǎn)
- sql路由
目的:把邏輯表的數(shù)據(jù)操作映射為對數(shù)據(jù)結(jié)點(diǎn)操作的過程
根據(jù)分片鍵操作類型分類:
1.單片路由:=
2.多片路由:in
3.范圍路由:between
4.廣播路由:不攜帶分片鍵
根據(jù)分片鍵進(jìn)行路由的場景分類:
直接路由
標(biāo)準(zhǔn)路由
笛卡爾路由
全庫表路由:廣播路由
sql改寫
目的1:將對邏輯表操作的sql,改寫為對真實(shí)表操作的sql
目的2:對于Group By,order By操作,在進(jìn)行結(jié)果歸并的時(shí)候,如果sql查詢的字段不包含 分組或排序的字段,那么在改寫后會(huì)將 原sql查詢的字段增加上 分組或排序的字段。為什么這么做呢?因?yàn)槿绻麤]有補(bǔ)充的話,兩張表的數(shù)據(jù)進(jìn)行結(jié)果歸并沒辦法進(jìn)行分組或排序,因?yàn)槿鄙倥判蛄?/p>
- Sql執(zhí)行
目的:負(fù)責(zé)將路由和改寫后的sql發(fā)送到底層數(shù)據(jù)庫去執(zhí)行
特點(diǎn):自動(dòng)化的平衡數(shù)據(jù)庫連接資源與執(zhí)行效率。它會(huì)在 內(nèi)存限制模式和 連接限制模式之間進(jìn)行自適應(yīng)的切換

OLAP:面向分析的系統(tǒng)
OLTP:面向事務(wù)的操作
- 結(jié)果歸并
目的:查詢遍歷,分組,排序,聚合的結(jié)果進(jìn)行歸并
歸并的分類:
內(nèi)存歸并
流式歸并
通過游標(biāo)實(shí)現(xiàn)。先讓每張表查詢的數(shù)據(jù)有序,再通過每張表的游標(biāo)進(jìn)行移動(dòng)來排序
- 裝飾者歸并
在以前歸并后的結(jié)果的基礎(chǔ)上做進(jìn)一步增強(qiáng),使用到了裝飾者模式
- Sharding-jdbc的執(zhí)行原理總結(jié)

Sharding-jdbc水平分庫配置規(guī)則
配置多個(gè)數(shù)據(jù)源

- 配置分庫策略:分庫鍵和分庫算法

分片策略:inline
- 配置數(shù)據(jù)節(jié)點(diǎn)

- Sharding-jdbc的優(yōu)化
查詢的時(shí)候盡量使用到分片鍵,避免廣播路由產(chǎn)生額外的sql查詢
Sharding-jdbc垂直分庫配置規(guī)則
配置數(shù)據(jù)源

-
配置數(shù)據(jù)節(jié)點(diǎn)
-
配置分表策略
Sharding-jdbc公共表
配置公共表

Sharding-jdbc讀寫分離
修改mysql的配置文件
配置從庫數(shù)據(jù)源

- 配置主庫從庫邏輯數(shù)據(jù)源

-
配置主庫從庫數(shù)據(jù)節(jié)點(diǎn)




