sharding-jdbc分庫分表入門知識點(diǎn)

  1. 為什么要分庫分表

隨著業(yè)務(wù)擴(kuò)大,系統(tǒng)訪問量增大,數(shù)據(jù)表數(shù)據(jù)增大,導(dǎo)致數(shù)據(jù)庫性能出現(xiàn)瓶頸

  1. 如何分庫分表

水平分庫分表,垂直分庫分表

垂直分表:將一張表按照字段劃分為多張表

垂直分庫:按照業(yè)務(wù),讓不同業(yè)務(wù)的表放在不同的數(shù)據(jù)庫中

垂直:針對的是數(shù)據(jù)表結(jié)構(gòu)進(jìn)行切分

水平分表:在同一個(gè)數(shù)據(jù)庫中,將一張表水平切分為多長表

水平分庫:將一張表切分成多張表到不同的數(shù)據(jù)庫中

水平:針對的是數(shù)據(jù)行進(jìn)行的切分

  1. 常用的分庫分表中間件

Sharding-jdbc(原則上不能稱做中間件,它是以jar包的形式存在的),mycat

  1. 垂直分表的作用

減少IO帶來的性能損耗

減少IO鎖表的可能

讓每頁存儲(chǔ)更多的行數(shù)據(jù)


垂直分表的原則: 讓熱門數(shù)據(jù)字段單獨(dú)分一張表,讓大字段不經(jīng)常查詢的到另外一張表

  1. 垂直分庫的作用

垂直分表只解決了單一表數(shù)據(jù)量過大的問題,但沒將表分到不同的數(shù)據(jù)庫中,因此每個(gè)表還是競爭同一個(gè)物理機(jī)的CPU,內(nèi)存,網(wǎng)絡(luò)IO,磁盤

垂直分庫的原則:按照業(yè)務(wù),讓數(shù)據(jù)庫中的表分到不同的數(shù)據(jù)庫中,專庫專用

  1. 水平分庫的作用

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

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

  1. 水平分表的作用

解決單表數(shù)據(jù)量過大的問題

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

  1. 分庫分表設(shè)計(jì)的最佳實(shí)踐原則
  1. 分庫分表需要解決的問題

1.事務(wù)一致性問題

分布式事務(wù)

  1. 跨結(jié)點(diǎn)關(guān)聯(lián)查詢

  2. 跨結(jié)點(diǎn)分頁、排序

  3. 主鍵避重

無法使用自增主鍵

  1. 公共表(多個(gè)表需要用到的表,如區(qū)域表)

  2. Sharding-jdbc的功能

功能:

  1. 數(shù)據(jù)分片

  2. 讀寫分離

  3. Sharding-jdbc分表規(guī)則配置

步驟:

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

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

  1. 配置主鍵生成策略
  1. 配置分表策略:分片鍵和分片算法

Where后的條件如果出現(xiàn)order_id,會(huì)根據(jù)這個(gè)order_id并通過分片算法到對應(yīng)的數(shù)據(jù)表中獲取數(shù)據(jù)

  1. 打開sql日志
  1. Sharding-jdbc的配置方法
  • Properties
  • Yml
  • @Configuration
  • Xml
  1. 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

  • 分片鍵(分片字段)
  • 分片算法
  • 分片策略

分片鍵+分片算法

  • 自增主鍵生成策略


  1. Sharding-jdbc的執(zhí)行原理

Sql解析->sql路由->sql改寫->sql執(zhí)行->結(jié)果合并

  1. sql解析

目的:標(biāo)記語法樹上的哪些結(jié)點(diǎn)可能會(huì)被改寫

分為詞法解析和語法解析

詞法解析:解析sql中的關(guān)鍵字

語法解析:將詞法解析的結(jié)果和sql生成語法樹

分為藍(lán)色ROOT,綠色:關(guān)鍵字,紅色:變量,白色:還可以再分子結(jié)點(diǎn)的結(jié)點(diǎn)

  1. sql路由

目的:把邏輯表的數(shù)據(jù)操作映射為對數(shù)據(jù)結(jié)點(diǎn)操作的過程

根據(jù)分片鍵操作類型分類:

1.單片路由:=

2.多片路由:in

3.范圍路由:between

4.廣播路由:不攜帶分片鍵

根據(jù)分片鍵進(jìn)行路由的場景分類:

  1. 直接路由

  2. 標(biāo)準(zhǔn)路由

  3. 笛卡爾路由

  4. 全庫表路由:廣播路由

  5. 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>

  1. 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ù)的操作

  1. 結(jié)果歸并

目的:查詢遍歷,分組,排序,聚合的結(jié)果進(jìn)行歸并

歸并的分類:

  1. 內(nèi)存歸并

  2. 流式歸并

通過游標(biāo)實(shí)現(xiàn)。先讓每張表查詢的數(shù)據(jù)有序,再通過每張表的游標(biāo)進(jìn)行移動(dòng)來排序

  1. 裝飾者歸并

在以前歸并后的結(jié)果的基礎(chǔ)上做進(jìn)一步增強(qiáng),使用到了裝飾者模式

  1. Sharding-jdbc的執(zhí)行原理總結(jié)
  1. Sharding-jdbc水平分庫配置規(guī)則

  2. 配置多個(gè)數(shù)據(jù)源

  1. 配置分庫策略:分庫鍵和分庫算法

分片策略:inline

  1. 配置數(shù)據(jù)節(jié)點(diǎn)
  1. Sharding-jdbc的優(yōu)化

查詢的時(shí)候盡量使用到分片鍵,避免廣播路由產(chǎn)生額外的sql查詢

  1. Sharding-jdbc垂直分庫配置規(guī)則

  2. 配置數(shù)據(jù)源

  1. 配置數(shù)據(jù)節(jié)點(diǎn)


  2. 配置分表策略


  3. Sharding-jdbc公共表

  4. 配置公共表

  1. Sharding-jdbc讀寫分離

  2. 修改mysql的配置文件

  3. 配置從庫數(shù)據(jù)源

  1. 配置主庫從庫邏輯數(shù)據(jù)源
  1. 配置主庫從庫數(shù)據(jù)節(jié)點(diǎn)



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容