MyBatis實現Mysql資料庫分庫分表操作和總結

來源:互聯網
上載者:User

標籤:sql語句   外掛程式   目錄   優點   標示   避免   sql   關聯   支援   

閱讀目錄

  • 前言
  • 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成本,即可上手,而且比較容易控制,就如同最上面給出的例子一樣,而且當前我處理的資料還沒有到達那種處處要分離的地步,所以我選擇第一種。也推薦使用。如果你找到比較好用的外掛程式或者中介軟體也可以在評論中推薦。

 

總結

在實際項目中,我是因為使用者的賬戶記錄過多所以不得不進行分離,而且因為賬戶記錄更多的只是新增沒有修改和刪除,查詢也是少數,所以使用了最簡單的方式進行分離,也選擇了最簡單的策略。希望上面的原則策略方式和問題的總結能對你有所協助,有所參考。

 

MyBatis實現Mysql資料庫分庫分表操作和總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.