image.png
主要過(guò)程包括:
- 分庫(kù)分表的路由定位
- sql語(yǔ)句的 ast 抽象語(yǔ)法樹的解析
- 通過(guò)自定義 SQLASTVisitor (MySQLSelectASTVisitor) 遍歷sql ast狠持,解析出邏輯表名
- 查找邏輯表名對(duì)應(yīng)的分庫(kù)分表規(guī)則
- 根據(jù)邏輯表的分庫(kù)分表規(guī)則棘脐,遍歷sql ast定位分片鍵的值 根據(jù)中間件的設(shè)計(jì)需要支持分庫(kù)分表語(yǔ)句的各種sql場(chǎng)景吓揪,遍歷ast樹,做一堆if else判斷 (分庫(kù)分表后敲茄,不應(yīng)該支持復(fù)雜的sql,可酌情考慮公司業(yè)務(wù)場(chǎng)景 需要支持的sql語(yǔ)句 來(lái)遍歷 sql樹)
- SqlRewrite#rewrite 改寫 sql語(yǔ)句,根據(jù)邏輯表的分庫(kù)分表規(guī)則和分片鍵的值专控,將邏輯表名改寫成目標(biāo)物理表名粟按; 改寫后的sql即為在目標(biāo)分庫(kù)中執(zhí)行的真實(shí)SQL 改寫sql的過(guò)程也是利用 SQLASTVisitor 來(lái)操作的诬滩,不過(guò)用的自定義的 ShardRewriteTableOutputVisitor (繼承輸出型visitor:SQLASTOutputVisitor)來(lái)遍歷 sql tree 輸出sql字符串, 遇到 SQLExprTableSource 節(jié)點(diǎn)的時(shí)候改寫表名
- 路由到目標(biāo)的分庫(kù)和分表 可能是多個(gè)庫(kù)和表灭将, #reWriteAndMergeParams 會(huì)把sql參數(shù)塞到所有重寫后的的分表sql語(yǔ)句中
- 后面再執(zhí)行的時(shí)候 會(huì)根據(jù) 路由結(jié)果是不是多個(gè)分庫(kù)疼鸟,按照配置單庫(kù)并發(fā)度 concurrencyLevel (默認(rèn)是1)來(lái)決定在每個(gè)目標(biāo)分庫(kù)中不同表的sql是用一個(gè)java 線程還是多個(gè)java線程并行執(zhí)行, 具體過(guò)程 參考 如果定位到多個(gè)分庫(kù)表怎么執(zhí)行的庙曙?