您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Mysql數據庫中的分庫分表怎么利用MyBatis來實現,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
MyBatis實現分表最簡單步驟
1、我們模擬用戶表數據量超過千萬(雖然實際不太可能)
2、用戶表原來的名字叫做user_tab
,我們切分為user_tab_0
和user_tab_1
(實際也可能不是這么隨意的名字),這樣就能把原來千萬的數據分離成兩個百萬的數據量的兩張表了。
3、如何操作這兩張表呢?我們利用userId也就是用戶的唯一標識進行區分。
4、userId%2 == 0
的用戶操作表user_tab_0
,同理userId%2 == 1
的用戶操作表user_tab_1
5、那么在MyBatis中sql語句如何實現呢?下面是舉例查詢一個用戶的sql語句
<select id="getUser" parameterType="java.util.Map" resultType="UserDO"> SELECT userId, name FROM user_tab_#{tabIndex} WHERE userId = #{userId} </select>
其中我們傳入了兩個參數tabIndex和userId,tabIndex就是需要操作表的標示值(0或1),這樣如果需要查詢userId為5的用戶,那么最終出現的sql語句就會是:
SELECT userId, name FROM user_tab_1 WHERE userId = 5
其他多余的DAO服務和實現我這里就不多展示了,相信聰明的你肯定會的。
以上就是最簡單的實現,不需要多余的框架,不需要任何的插件也就滿足了分表的要求。
上面基本上就是所有實現的內容了,下面就要開始詳細說說分離的細節了,看熱鬧的基本可以散了。
我將從下面幾個角度分別來說說。我盡可能用最簡單的白話來說。
分離的方式
切分的方式主要有兩種,水平切分和垂直切分。
1、水平切分
簡單的說就是,把一張表分離成幾張一模一樣的表,然后表的名字不同。就和上面最簡單的例子一樣。
這種切分適合于一張表的數據量過大而導致操作時間變慢的情況,如保存的一些記錄表。
2、垂直切分
把不同的業務模塊分成不同的數據庫,這些業務模塊直接最好是0耦合(簡單的說就是毫無關系)。
這主要是適合數據量普遍較大,而且業務場景比較分散,互相之間沒有邏輯關系的情況。
分離的策略
具體的策略有很多種,你也可以設計你自己的,普遍的策略有下面幾種,只是列舉就不具體展開了。
1、“%”取模,也就是上面例子中實現的,也是最簡單的一種。
2、MD5哈希
3、移位
4、日期時間(根據不同的日期分表,如一個月一張表,這個月就操作這張表,下個月就下張表)
5、枚舉范圍(用戶1-10000操作第一張表,用戶10001-20000操作第二張表)
分離的問題
下面說說最終要的點,導致的問題。
數據庫肯定不是你說分就分的。(人家比較有感情的,怎么能說分就分呢?)
正經來說,我列舉了下面幾個分離只有會導致的問題。
1、添加時主鍵唯一性的問題;分離之后多張表,就會導致原有的自增長主鍵不唯一,所以沒有辦法自增長了,導致問題,解決方案的也是有的,比如單獨維護一張主鍵表專門用來存放當前主鍵,或者說用別的中間件等。
2、新增時的效率問題,雖然不是個大問題,但是新增肯定會多了計算量嘛,這個問題可以忽略不計。
3、查詢所帶來的分頁問題,分離成多張表之后,分頁查詢就很困難了,這也考慮到不同的分離用不同的解決方案,總之會產生問題。
4、同理,關聯查詢,原本一張表關聯別的表或者別的表關聯一張表,都很簡單,但是現在分離之后就難了。
5、事務問題,多張表需要使用分布式事務才能完成原來帶有事務的操作。因為原來的事務只是鎖一張表現在可能要鎖多張了呢。
6、擴展性問題,有的切分策略下,對數據的擴展性其實不好,之后如果有更多的數據來了,是說還能再新建表來擴展嗎?
分離的原則
下面總結了幾點分離的原則,主要是參考了網絡上的,沒有任何實際的依據(我也不是個年薪百萬的DBA也碰不到那么大的數據去實際檢驗嘛),所以如果有任何問題也請指出。
1、能不分就不分
2、能分少就不分多
3、多冗余,不關聯
4、避免使用分布式事務,主要是太難我也不會啊
5、單表千萬記錄以內就不分
6、現在不分以后分也來得及
7、擴展,耦合,仔細考慮
實現分離的方式
最后說說分離的方式,現在流行使用的DAO框架是MyBatis,也有很多別的框架。分離的實現主要有下面幾種方式。
1、原生實現,就和最上面的例子一樣,不需要其他任何的東西,利用原生的框架,自己去控制實現。
優點是:容易控制,掌握主動權。
缺點是:代碼量多,需要自己很清楚,修改不方便,不支持復雜的切分,比如切分之后還需要做一些分頁查詢,還有上面說的主鍵問題等。
2、插件實現,利用框架本身開發的一些插件,去實現這些插件,然后利用插件去訪問數據庫,直接實現分離。
優點是:代碼量少,實現簡單,擴展性好。
缺點是:不易控制,分離方式有限,出現問題難以解決。沒有找到特別成熟的插件。
3、中間件實現。利用一些數據庫訪問的中間件,在訪問數據庫之前做一些操作使得sql進行相應的變化從而實現分離。
優點是:耦合小,擴展性好,可以解決分布式事務的問題。
確定是:實現比較復雜,需要對中間件進行學習,成本較大。維護也是一個大問題,萬一掛掉了。。
總之方式各有千秋,但是考慮到成本上面,第一種幾乎是0成本,即可上手,而且比較容易控制,就如同最上面給出的例子一樣,而且當前我處理的數據還沒有到達那種處處要分離的地步,所以我選擇第一種。也推薦使用。如果你找到比較好用的插件或者中間件也可以在評論中推薦。
以上就是Mysql數據庫中的分庫分表怎么利用MyBatis來實現,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。