他非讓我分表
- 2019 年 12 月 15 日
- 筆記
分庫分表初見
曾經為了面試,熟讀並背誦了那麼多騷操作,對於數據庫這方面,常會背到的就是 sql 優化,分庫分表了。

當分表來臨時
昨天一個戴眼鏡的老哥告訴我
有一個表未來數據量會比較大,我準備給他切了,可能會影響你那邊。
我去?飛來橫禍?我這 CRUD 過的很開心,分什麼表啊。為此趕緊調動我面試時背誦的各種知識點,跟老哥進行一場 battle,渴望不分表,繼續單表開開心心。可惜敗下陣來,還是太年輕了。沒辦法,開始 coding 吧!
最開始想是直接引入 sharding-jdbc,第一次操作,不得不說 sharding-jdbc 的文檔真不怎麼樣,搞了半天總是報錯,各種錯,反正是沒跑起來。於是乎,一個騷操作湧上心頭。我這邊對這個表的操作很簡單,就是 select,實在不行,直接改 sql 吧。我要是直接把
select * from table
改成
select * from table0 union select * from table1 union....
那未來承接這個項目的同學可能會把我罵死,不過讓他罵不到也很容易,三下五除二,把代碼上的 created by 署名刪除了,嗯!完美!hahahahahha…..冷靜三秒之後,覺得還是不要這麼搞了,畢竟我是一個專業的軟件工程師,擔負著拯救人類的重任。算了,再想想招兒吧。ORM 用的是 mybatis,於是乎一個想法湧上心頭,mybatis 不是有插件嘛,我直接來個統一處理完事了唄,不得不佩服自己的機智,很快搞了起來。
demo(地址附在文末)
talk is cheap,show me the code —–大師如此說道
mybatis 插件其實就是攔截器,可以用申明簽名的方式,指定我們要攔截的方法,從中獲取我們需要的信息,加入自定義的邏輯操作。也就是說,它可以幫我們攔截 sql,在 sql 提交給 jdbc 執行前的那一刻,將他攔截下來,判斷他的分表策略和操作類型(demo 中以註解的形式申明),然後進行 sql 處理(demo 中使用的是 druid 的 sql 解析模塊),整合出我們最終需要的 sql。
當然了,這麼典型的需求,肯定已經有人做好輪子等着我們去用了,就如上面對話中所提及的幾個,比如其中的 sharding-jdbc,做的就是幫我們攔截 sql,解析 sql,路由執行,結果聚合。這一切對於我們用戶是透明的,我們無需改任何代碼,只要加入 sharding-jdbc 的配置參數就可以開心的分庫分表了,但考慮到各種原因,有些複雜 sql 是不支持的,這個可以參考官方文檔。
這個 demo 記錄了從單表操作到自定義分表插件,再到使用 sharding-jdbc 進行分表操作的全歷程。demo 只能演示 select * from table 這樣簡單語句的全套操作歷程,但也足以體現整個思路。使用自定義插件實現分表對應的是 demo 中的 version2 分支。使用sharding-jdbc 完成分表對應的是 demo 中的 version3 分支。
詳見demo
地址:https://github.com/naget/sharding
參考資料
- https://github.com/alibaba/druid/wiki/SQL-Parser
- https://mp.baomidou.com/guide/quick-start.html#%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96
- https://github.com/apache/incubator-shardingsphere/issues/1900
- https://mybatis.org/mybatis-3/zh/configuration.html#plugins