搜尋
首頁資料庫mysql教程MyBatis如何實作Mysql資料庫分庫分錶的實例詳解

MyBatis如何實作Mysql資料庫分庫分錶的實例詳解

Aug 23, 2017 pm 01:52 PM
mybatismysql資料庫

這篇文章主要介紹了MyBatis實作Mysql資料庫分庫分庫分錶操作與總結,需要的朋友可以參考下

前言

作為一個資料庫,作為資料庫中的一張表,隨著使用者的增多隨著時間的推移,總有一天,資料量會大到一個難以處理的地步。這時僅僅一張表的資料就已經超過了千萬,無論是查詢還是修改,對於它的操作都會很耗時,這時就需要進行資料庫切分的操作了。

MyBatis實作分錶最簡單步驟​​

#既然文章的標題都這麼寫了,不如直接上乾貨來的比較實際,我們就先來看看如何實現最簡單的分錶。

1、我們模擬用戶表資料量超過千萬(雖然實際上不太可能)

2、用戶表原來的名字叫做user_tab,我們切分為user_tab_0user_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資料庫分庫分錶的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL的許可與其他數據庫系統相比如何?MySQL的許可與其他數據庫系統相比如何?Apr 25, 2025 am 12:26 AM

MySQL使用的是GPL許可證。 1)GPL許可證允許自由使用、修改和分發MySQL,但修改後的分發需遵循GPL。 2)商業許可證可避免公開修改,適合需要保密的商業應用。

您什麼時候選擇InnoDB而不是Myisam,反之亦然?您什麼時候選擇InnoDB而不是Myisam,反之亦然?Apr 25, 2025 am 12:22 AM

選擇InnoDB而不是MyISAM的情況包括:1)需要事務支持,2)高並發環境,3)需要高數據一致性;反之,選擇MyISAM的情況包括:1)主要是讀操作,2)不需要事務支持。 InnoDB適合需要高數據一致性和事務處理的應用,如電商平台,而MyISAM適合讀密集型且無需事務的應用,如博客系統。

在MySQL中解釋外鍵的目的。在MySQL中解釋外鍵的目的。Apr 25, 2025 am 12:17 AM

在MySQL中,外鍵的作用是建立表與表之間的關係,確保數據的一致性和完整性。外鍵通過引用完整性檢查和級聯操作維護數據的有效性,使用時需注意性能優化和避免常見錯誤。

MySQL中有哪些不同類型的索引?MySQL中有哪些不同類型的索引?Apr 25, 2025 am 12:12 AM

MySQL中有四種主要的索引類型:B-Tree索引、哈希索引、全文索引和空間索引。 1.B-Tree索引適用於範圍查詢、排序和分組,適合在employees表的name列上創建。 2.哈希索引適用於等值查詢,適合在MEMORY存儲引擎的hash_table表的id列上創建。 3.全文索引用於文本搜索,適合在articles表的content列上創建。 4.空間索引用於地理空間查詢,適合在locations表的geom列上創建。

您如何在MySQL中創建索引?您如何在MySQL中創建索引?Apr 25, 2025 am 12:06 AM

toCreateAnIndexinMysql,usethecReateIndexStatement.1)forasingLecolumn,使用“ createIndexIdx_lastNameEnemployees(lastName); 2)foracompositeIndex,使用“ createIndexIndexIndexIndexIndexDx_nameOmplayees(lastName,firstName,firstName);” 3)forauniqe instex,creationexexexexex,

MySQL與Sqlite有何不同?MySQL與Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是什麼?它們如何提高性能?MySQL中的索引是什麼?它們如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

說明如何使用MySQL中的交易來確保數據一致性。說明如何使用MySQL中的交易來確保數據一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境