最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis實現(xiàn)Mysql數(shù)據(jù)庫分庫分表操作和總結(jié)(推薦)

 更新時間:2017年08月21日 16:23:53   作者:LinkinStar  
這篇文章主要介紹了MyBatis實現(xiàn)Mysql數(shù)據(jù)庫分庫分表操作和總結(jié),需要的朋友可以參考下

前言

作為一個數(shù)據(jù)庫,作為數(shù)據(jù)庫中的一張表,隨著用戶的增多隨著時間的推移,總有一天,數(shù)據(jù)量會大到一個難以處理的地步。這時僅僅一張表的數(shù)據(jù)就已經(jīng)超過了千萬,無論是查詢還是修改,對于它的操作都會很耗時,這時就需要進行數(shù)據(jù)庫切分的操作了。

MyBatis實現(xiàn)分表最簡單步驟

既然文章的標題都這么寫了,不如直接上干貨來的比較實際,我們就先來看看如何實現(xiàn)最簡單的分表。

1、我們模擬用戶表數(shù)據(jù)量超過千萬(雖然實際不太可能)

2、用戶表原來的名字叫做user_tab,我們切分為user_tab_0user_tab_1(實際也可能不是這么隨意的名字),這樣就能把原來千萬的數(shù)據(jù)分離成兩個百萬的數(shù)據(jù)量的兩張表了。

3、如何操作這兩張表呢?我們利用userId也就是用戶的唯一標識進行區(qū)分。

4、userId%2 == 0的用戶操作表user_tab_0,同理userId%2 == 1的用戶操作表user_tab_1

5、那么在MyBatis中sql語句如何實現(xiàn)呢?下面是舉例查詢一個用戶的sql語句

<select id="getUser" parameterType="java.util.Map" resultType="UserDO"> 
    SELECT userId, name 
    FROM user_tab_#{tabIndex} 
    WHERE userId = #{userId} 
</select>

其中我們傳入了兩個參數(shù)tabIndex和userId,tabIndex就是需要操作表的標示值(0或1),這樣如果需要查詢userId為5的用戶,那么最終出現(xiàn)的sql語句就會是:

SELECT userId, name 
FROM user_tab_1 
WHERE userId = 5

其他多余的DAO服務和實現(xiàn)我這里就不多展示了,相信聰明的你肯定會的。

以上就是最簡單的實現(xiàn),不需要多余的框架,不需要任何的插件也就滿足了分表的要求。

上面基本上就是所有實現(xiàn)的內(nèi)容了,下面就要開始詳細說說分離的細節(jié)了,看熱鬧的基本可以散了。

我將從下面幾個角度分別來說說。我盡可能用最簡單的白話來說。

分離的方式

切分的方式主要有兩種,水平切分和垂直切分。

1、水平切分

簡單的說就是,把一張表分離成幾張一模一樣的表,然后表的名字不同。就和上面最簡單的例子一樣。

這種切分適合于一張表的數(shù)據(jù)量過大而導致操作時間變慢的情況,如保存的一些記錄表。

2、垂直切分

把不同的業(yè)務模塊分成不同的數(shù)據(jù)庫,這些業(yè)務模塊直接最好是0耦合(簡單的說就是毫無關(guān)系)。

這主要是適合數(shù)據(jù)量普遍較大,而且業(yè)務場景比較分散,互相之間沒有邏輯關(guān)系的情況。

分離的策略

具體的策略有很多種,你也可以設(shè)計你自己的,普遍的策略有下面幾種,只是列舉就不具體展開了。

1、“%”取模,也就是上面例子中實現(xiàn)的,也是最簡單的一種。

2、MD5哈希

3、移位

4、日期時間(根據(jù)不同的日期分表,如一個月一張表,這個月就操作這張表,下個月就下張表)

5、枚舉范圍(用戶1-10000操作第一張表,用戶10001-20000操作第二張表)

分離的問題

下面說說最終要的點,導致的問題。

數(shù)據(jù)庫肯定不是你說分就分的。(人家比較有感情的,怎么能說分就分呢?)

正經(jīng)來說,我列舉了下面幾個分離只有會導致的問題。

1、添加時主鍵唯一性的問題;分離之后多張表,就會導致原有的自增長主鍵不唯一,所以沒有辦法自增長了,導致問題,解決方案的也是有的,比如單獨維護一張主鍵表專門用來存放當前主鍵,或者說用別的中間件等。

2、新增時的效率問題,雖然不是個大問題,但是新增肯定會多了計算量嘛,這個問題可以忽略不計。

3、查詢所帶來的分頁問題,分離成多張表之后,分頁查詢就很困難了,這也考慮到不同的分離用不同的解決方案,總之會產(chǎn)生問題。

4、同理,關(guān)聯(lián)查詢,原本一張表關(guān)聯(lián)別的表或者別的表關(guān)聯(lián)一張表,都很簡單,但是現(xiàn)在分離之后就難了。

5、事務問題,多張表需要使用分布式事務才能完成原來帶有事務的操作。因為原來的事務只是鎖一張表現(xiàn)在可能要鎖多張了呢。

6、擴展性問題,有的切分策略下,對數(shù)據(jù)的擴展性其實不好,之后如果有更多的數(shù)據(jù)來了,是說還能再新建表來擴展嗎?

分離的原則

下面總結(jié)了幾點分離的原則,主要是參考了網(wǎng)絡上的,沒有任何實際的依據(jù)(我也不是個年薪百萬的DBA也碰不到那么大的數(shù)據(jù)去實際檢驗嘛),所以如果有任何問題也請指出。

1、能不分就不分

2、能分少就不分多

3、多冗余,不關(guān)聯(lián)

4、避免使用分布式事務,主要是太難我也不會啊

5、單表千萬記錄以內(nèi)就不分

6、現(xiàn)在不分以后分也來得及

7、擴展,耦合,仔細考慮

實現(xiàn)分離的方式

最后說說分離的方式,現(xiàn)在流行使用的DAO框架是MyBatis,也有很多別的框架。分離的實現(xiàn)主要有下面幾種方式。

1、原生實現(xiàn),就和最上面的例子一樣,不需要其他任何的東西,利用原生的框架,自己去控制實現(xiàn)。

優(yōu)點是:容易控制,掌握主動權(quán)。

缺點是:代碼量多,需要自己很清楚,修改不方便,不支持復雜的切分,比如切分之后還需要做一些分頁查詢,還有上面說的主鍵問題等。

2、插件實現(xiàn),利用框架本身開發(fā)的一些插件,去實現(xiàn)這些插件,然后利用插件去訪問數(shù)據(jù)庫,直接實現(xiàn)分離。

優(yōu)點是:代碼量少,實現(xiàn)簡單,擴展性好。

缺點是:不易控制,分離方式有限,出現(xiàn)問題難以解決。沒有找到特別成熟的插件。

3、中間件實現(xiàn)。利用一些數(shù)據(jù)庫訪問的中間件,在訪問數(shù)據(jù)庫之前做一些操作使得sql進行相應的變化從而實現(xiàn)分離。

優(yōu)點是:耦合小,擴展性好,可以解決分布式事務的問題。

確定是:實現(xiàn)比較復雜,需要對中間件進行學習,成本較大。維護也是一個大問題,萬一掛掉了。。

總之方式各有千秋,但是考慮到成本上面,第一種幾乎是0成本,即可上手,而且比較容易控制,就如同最上面給出的例子一樣,而且當前我處理的數(shù)據(jù)還沒有到達那種處處要分離的地步,所以我選擇第一種。也推薦使用。如果你找到比較好用的插件或者中間件也可以在評論中推薦。

總結(jié)

在實際項目中,我是因為用戶的賬戶記錄過多所以不得不進行分離,而且因為賬戶記錄更多的只是新增沒有修改和刪除,查詢也是少數(shù),所以使用了最簡單的方式進行分離,也選擇了最簡單的策略。希望上面的原則策略方式和問題的總結(jié)能對你有所幫助,有所參考。如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java的package和import機制原理解析

    java的package和import機制原理解析

    這篇文章主要介紹了java的package和import機制原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 淺談升級Spring Cloud到Finchley后的一點坑

    淺談升級Spring Cloud到Finchley后的一點坑

    這篇文章主要介紹了淺談升級Spring Cloud到Finchley后的一點坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Java 判斷兩個字符串是否由相同的字符組成的實例

    Java 判斷兩個字符串是否由相同的字符組成的實例

    今天小編就為大家分享一篇Java 判斷兩個字符串是否由相同的字符組成的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • SpringBoot之RestTemplate在URL中轉(zhuǎn)義字符的問題

    SpringBoot之RestTemplate在URL中轉(zhuǎn)義字符的問題

    這篇文章主要介紹了SpringBoot之RestTemplate在URL中轉(zhuǎn)義字符的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java實現(xiàn)合并兩個有序序列算法示例

    Java實現(xiàn)合并兩個有序序列算法示例

    這篇文章主要介紹了Java實現(xiàn)合并兩個有序序列算法,簡單描述了序列合并算法的原理與java合并有序序列的具體操作步驟及相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • Java使用JSQLParser解析和操作SQL的技術(shù)指南

    Java使用JSQLParser解析和操作SQL的技術(shù)指南

    在開發(fā)過程中,解析和操作?SQL?是一個常見的需求,JSQLParser?是一個強大的開源?Java?庫,用于解析?SQL?并提供語法樹操作功能,本文將詳細介紹如何使用?JSQLParser,并提供常見使用場景的代碼示例,需要的朋友可以參考下
    2025-04-04
  • Java中的自旋鎖spinlock詳解

    Java中的自旋鎖spinlock詳解

    這篇文章主要介紹了Java中的自旋鎖spinlock詳解,自旋鎖就是循環(huán)嘗試獲取鎖,不會放棄CPU時間片,減傷cup上下文切換,缺點是循環(huán)會消耗cpu,需要的朋友可以參考下
    2024-01-01
  • Java中super關(guān)鍵字詳解

    Java中super關(guān)鍵字詳解

    這篇文章主要為大家詳細介紹了Java中super關(guān)鍵字,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • SpringBoot如何實現(xiàn)文件下載

    SpringBoot如何實現(xiàn)文件下載

    這篇文章主要介紹了SpringBoot如何實現(xiàn)文件下載問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot項目打包部署到Tomcat的操作流程

    SpringBoot項目打包部署到Tomcat的操作流程

    在最近一個項目中,維護行里一個年代較為久遠的單體項目,需要將項目打包放到的tomcat服務器下運行,所以本文就給大家介紹一下SpringBoot項目打包部署到Tomcat的流程步驟,需要的朋友可以參考下
    2023-08-08

最新評論

鄂温| 个旧市| 黄龙县| 沂南县| 宣汉县| 加查县| 靖江市| 文化| 咸阳市| 通化县| 阳东县| 梅州市| 梅州市| 绵阳市| 内丘县| 东兰县| 梅河口市| 长武县| 岳普湖县| 集安市| 武宁县| 平湖市| 南乐县| 滦南县| 扎鲁特旗| 蒙山县| 阿巴嘎旗| 鄂温| 介休市| 东方市| 滦南县| 沈丘县| 桦川县| 孙吴县| 永仁县| 谢通门县| 镇雄县| 武川县| 商丘市| 苏尼特右旗| 盖州市|