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

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

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

這篇文章主要介紹了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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL的角色:Web應用程序中的數據庫 MySQL的角色:Web應用程序中的數據庫 Apr 17, 2025 am 12:23 AM

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

甲骨文在商業世界中的作用 甲骨文在商業世界中的作用 Apr 23, 2025 am 12:01 AM

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

See all articles