使用calcite製作分庫分表中介軟體,在實現功能的過程中,存在著幾種用途,總得來說,有三種.
例子1觀察此sql
update person set firstname = 'fred' where lastname = 'wilson'
calcite會把它編譯成類似下面的關係表示式
logicaltablemodify
logicalfilter
logicalproject
logicaltablescan
我們僅僅需要分析logicalfilter條件,就能路由此sql,並不需要calcite的執行器來執行
例子2
update person set firstname = 'fred' where lastname = 'wilson' and 1=1;
insert into persons values ('gates', 'bill', 'xuanwumen 10', 'beijing',1+1);
與上述的例子不同,增加了表示式計算
logicalfilter(....,n=true)
logicalproject(....,1=1)
logicalvalues(....,true)//常量摺疊
logicalproject(....,1+1)
logicalvalues({})//空的一行
一般來說,logicalproject會包含計算的表示式,此時我們基於使用分庫分表的架構,我們可以繼續分析logicalfilter得出對應的分片,而且可以利用logicalproject編譯出表示式計算器,對sql的表示式進行化簡,計算,最終得到常量,進一步轉化為sql語法樹中的文字直接量.
所以在這個例子中,我們並沒有完全使用calcite的執行器,僅僅使用了必要的部分logicalproject的執行器.當然大部分情況下,sql可以直接發往資料庫中執行,並不需要對表示式計算,但是遇上一些特殊情況,我們就要處理它,比如按日期分片,使用now函式得出日期,我們就有必要執行now函式,得到常量值,然後進一步路由.或者函式需要引用session級別的變數,比如user(),last_lnsert_id(),這些變數在物理庫是不一致的,所以我們有必要對他們進行計算.
大部分專案都直接把calcite用作查詢器,畢竟現實條件就是如此,受到開發能力,時間限制,沒有能力編寫sql查詢編譯器也沒有能力實現完整的執行器.
他們立足於calcite支援的標準sql語法定製改造.
當我們擁有自己實現的sql編譯器,也有了自己實現的執行器.我們就可以僅僅引入calcite作為優化器.具體來說也很簡單.使用relbuilder構建出需要優化的部分relnode,然後使用優化器進行優化,求解.然後把relnode結果重新轉換為自己實現的關係表示式/執行器.
基於Calcite製作分庫分表中介軟體 方案3
上次提到模版結合新自定義關係表示式來實現有效的sql生成,那麼我們可不可以像方案1中借鑑calcite現成的功能來實現對之前的方案進行改進.答案是有的 直觀的改進方法有三種 目錄 基於calcite製作分庫分表中介軟體 方案3 表函式法 規則下推 自定義關係表示式 自定義關係表示式 自定義生成執行器...
基於MySQL分庫分表方案簡介
1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...
基於MySQL分庫分表方案簡介
1 大資料量的儲存需要大量的資料庫資源 2 資料量的不斷增長要求資料庫儲存具有可擴充套件性 3 在保證大資料量的情況下,要保證效能 高可用性等質量要求 4 現有框架中沒有徹底解決大資料量的儲存問題 5 oracle等海量儲存方案 不菲,採用mysql進行分庫分表節約it成本。1.風險評估 1 dba...