[zebra原始碼]分片語句ShardPreparedStatement執行過程

mushishi發表於2021-07-16

image.png

主要過程包括:

  1. 分庫分表的路由定位
  2. sql語句的 ast 抽象語法樹的解析
  3. 通過自定義 SQLASTVisitor (MySQLSelectASTVisitor) 遍歷sql ast,解析出邏輯表名
  4. 查詢邏輯表名對應的分庫分表規則
  5. 根據邏輯表的分庫分表規則,遍歷sql ast定位分片鍵的值 根據中介軟體的設計需要支援分庫分表語句的各種sql場景,遍歷ast樹,做一堆if else判斷 (分庫分表後,不應該支援複雜的sql,可酌情考慮公司業務場景 需要支援的sql語句 來遍歷 sql樹)
  6. SqlRewrite#rewrite 改寫 sql語句,根據邏輯表的分庫分表規則和分片鍵的值,將邏輯表名改寫成目標物理表名; 改寫後的sql即為在目標分庫中執行的真實SQL 改寫sql的過程也是利用 SQLASTVisitor 來操作的,不過用的自定義的 ShardRewriteTableOutputVisitor (繼承輸出型visitor:SQLASTOutputVisitor)來遍歷 sql tree 輸出sql字串, 遇到 SQLExprTableSource 節點的時候改寫表名
  7. 路由到目標的分庫和分表 可能是多個庫和表, #reWriteAndMergeParams 會把sql引數塞到所有重寫後的的分表sql語句中
  8. 後面再執行的時候 會根據 路由結果是不是多個分庫,按照配置單庫併發度 concurrencyLevel (預設是1)來決定在每個目標分庫中不同表的sql是用一個java 執行緒還是多個java執行緒並行執行, 具體過程 參考 如果定位到多個分庫表怎麼執行的?

相關文章