MYSQL中的分庫分表及產生的分布式問題

分庫分表是分布式數據庫架構中常用的優化手段,用于解決單庫單表數據量過大、性能瓶頸等問題。其核心思想是將數據分散到多個數據庫(分庫)或多個表(分表)中,以提升系統的吞吐量、查詢性能可擴展性

一:為什么要分庫分表?

MySQL單庫數據量超過5000萬或單表數據量超過1000萬時,性能會顯著下降。隨著數據增長,單庫單表的查詢和寫入效率逐漸成為系統瓶頸。

二:拆分類型

拆分類型可分為兩類:水平拆分和垂直拆分。

1.水平拆分

水平拆分又分為水平分庫和水平分表。

1)水平分庫:將相同表結構的表復制到另一個庫中,減少單個數據庫的訪問壓力。

優點

  • 提升系統吞吐量:大幅降低單庫數據量,提升查詢和寫入性能;
  • 便于擴展支持數據庫層面的水平擴展(增加數據庫節點)。
  • 提高可用性單個數據庫故障不會影響整體服務,其他庫仍可正常訪問。

缺點

  • 跨庫查詢復雜:需要聚合多個庫的數據時,需借助中間件或手動處理,性能較低。
  • 事務一致性難保證:分布式事務實現復雜,通常需引入額外機制。

2)水平分表:是將同一張表的數據分到多個表中,提高查詢效率。

優點

  • 單表數據量可控:將大表拆分為小表,避免單表數據量過大導致的索引效率下降、查詢變慢等問題。
  • 提高并發性能:不同分表可分散到不同磁盤或物理機,降低I/O爭用。

缺點

  • 跨表查詢麻煩:需合并多個分表結果,查詢復雜。
  • 擴容復雜度高:后期調整分表數量時,需要進行數據遷移。

2.垂直拆分

垂直拆分又分為垂直分庫和垂直分表。

1)垂直分庫:將不同表分到不同庫中,降低單機的訪問瓶頸。

優點

  • 業務解耦:按業務維度拆分庫,不同業務的數據獨立存儲,降低耦合度。
  • 資源隔離:不同庫可部署在不同服務器,避免資源競爭(如CPU、內存、磁盤IO)。
  • 擴展性強:業務增長時可單獨擴展特定庫的硬件資源。

缺點

  • 跨庫查詢復雜:需通過接口或中間件(如ShardingSphere)實現跨庫關聯查詢,開發復雜度高。
  • 事務一致性難保證:分布式事務(如Seata)引入的性能開銷。

2)垂直分表:將一張表的不同列拆分到多個表中,比如將熱點字段或者長度大的字段單獨分表。

優點

  • 冷熱數據分離:將高頻字段與低頻字段拆分,減少單表數據量,提升查詢效率。
  • 減少鎖沖突:不同業務字段拆分后,更新操作鎖定更少數據。

缺點

  • 查詢復雜:跨表查詢需關聯操作,增加開發復雜度;
  • 數據量大:仍需解決單表數據量過大問題。

三:分庫分表策略

在選取分庫分表的策略前,首先要了解什么是分片鍵。

分片鍵(Sharding Key):決定數據分布的字段,需選擇高頻查詢條件(如用戶 ID、訂單 ID),避免跨分片查詢(盡量選取連續的分片放到同一個庫或表中)。

1.常見的分片策略

1)哈希取模:對分片字段進行哈希取模(shard_id = hash(key) % node_count)

??優點:

  • 數據分布均勻,不會容易出現冷熱數據分離導致性能瓶頸。

??缺點:

  • 擴容時需遷移大量數據(如從 3 庫擴至 4 庫,需重新計算所有數據的分片)。
  • 會出現跨分片查詢的情況(如要查詢訂單金額前10,需要查詢每段分片的前10然后比較)。

2)范圍劃分:按時間(如年 / 月)或數值范圍(如用戶 ID>1000 萬)分片,適合遞增數據(如訂單)。

優點:

  • 便于水平擴展,如果要進行擴容,只需要添加節點即可,無需像哈希取模一樣要進行數據遷移。
  • 連續分片能夠盡可能的避免跨分片查詢,提高查詢性能。

?缺點:

  • 可能導致熱點分片(如最新月份的數據量過大),會被頻繁的讀和寫,從而導致單個分片的數據量訪問過大,出現性能瓶頸。

四.分布式問題

1.分布式主鍵:分庫分表后需保證不同庫 / 表的主鍵唯一。

  • UUID:簡單易用,但作為主鍵性能較差(字符串類型,索引效率低)。
  • 雪花算法(Snowflake):生成 64 位唯一整數,包含時間戳、機器 ID 等,性能高且有序,適用于高并發場景。
  • 數據庫自增序列:每個分片設置不同的起始值和步長(如庫 1 起始 1、步長 3;庫 2 起始 2、步長 3),避免主鍵沖突。

2.分布式事務:分布式事務需要解決跨節點(如跨數據庫、跨服務)操作的原子性問題,即確保多個節點的操作要么全部成功,要么全部回滾,下面主要講解seata中的兩種模式。

在講解兩種模式前需要了解三個概念。

  • TM(Transaction Manager):事務管理器
  • TC(Transaction Coordinator):事務協調者
  • RM(Resource Manager):資源管理器
特性AT 模式(Auto Transaction)XA 模式
一致性級別最終一致(柔性事務)強一致(剛性事務)
業務侵入性無侵入(基于生成回滾日志)低侵入(需使用 Seata 提供的 XA 數據源)
性能損耗較低(僅在提交 / 回滾階段有少量額外開銷)較高(兩階段提交需等待所有分支事務響應)
隔離性基于全局鎖實現讀已提交(RC)支持可重復讀(RR)等強隔離級別
適用場景高并發、允許短暫不一致的業務(如電商訂單、庫存)金融級強一致場景(如資金轉賬、賬戶余額)
數據庫支持關系型數據庫(MySQL、Oracle 等)支持 XA 協議的數據庫(MySQL 5.7+、PostgreSQL)

1)AT模式

(1)一階段(Prepare)

  • 注冊分支事務
  • 生成回滾日志:將相關信息存入 UNDO_LOG 表。
  • SQL 執行并提交
  • 釋放本地鎖:本地事務提交,釋放數據庫行鎖。

(2)二階段(Commit/Rollback)分為提交和回滾兩種情況

  • 提交(Commit):TM(事務管理器)通知 RM(資源管理器)直接刪除 UNDO_LOG,無需操作數據庫。
  • 回滾(Rollback):RM 通過 UNDO_LOG 中的記錄恢復數據。

2)XA模式(兩階段提交模式)

XA 模式基于數據庫原生 XA 協議實現強一致事務,遵循“兩階段提交(2PC)”?協議:

(2)一階段(Prepare)

  • TM 向所有 RM 發送prepare請求。
  • RM 執行本地事務,但不提交,將事務資源鎖定。
  • RM 向 TM 返回成功失敗

(2)二階段(Commit/Rollback)

  • 若所有 RM 均返回成功,TM 發送commit,RM 提交本地事務;
  • 若任一 RM 失敗,TM 發送rollback,RM 回滾本地事務。

五.Seata 中如何配置?

(一)AT 模式配置示例(基于 Spring Boot)

seata:enabled: trueapplication-id: ${spring.application.name}tx-service-group: my_test_tx_groupconfig:type: nacos  # 配置中心類型nacos:server-addr: 127.0.0.1:8848registry:type: nacos  # 注冊中心類型nacos:server-addr: 127.0.0.1:8848data-source-proxy-mode: AT  # 指定AT模式

關鍵步驟

  1. 引入 Seata 客戶端依賴;
  2. 配置數據源代理(DataSourceProxy);
  3. 在需要分布式事務的方法上添加@GlobalTransactional注解。

(二)XA 模式配置示例

seata:data-source-proxy-mode: XA  # 指定XA模式xa-override-boundary: true  # 允許XA事務跨越多個本地事務

關鍵步驟

  1. 使用 Seata 提供的SeataDataSourceProxyXA包裝數據源;
  2. 確保數據庫開啟 XA 支持(如 MySQL 需設置innodb_support_xa=ON);
  3. 其余配置與 AT 模式類似。

六.總結

維度AT 模式XA 模式
事務協調機制基于 UNDO_LOG 和全局鎖基于數據庫 XA 協議
資源鎖定時間僅在一階段執行期間鎖定(時間短)一階段到二階段提交期間一直鎖定(時間長)
性能高(接近本地事務)低(兩階段提交開銷大)
回滾機制自動根據 UNDO_LOG 回滾依賴數據庫回滾能力
隔離級別讀已提交(RC)可重復讀(RR)等數據庫原生級別
異常處理需處理全局鎖沖突和補償失敗需處理事務懸掛和協調者故障
  • AT 模式是 Seata 的默認模式,適合大多數高并發、最終一致的業務場景,通過無侵入的方式實現柔性事務。
  • XA 模式適合對一致性要求極高的金融級業務,依賴數據庫原生支持實現強一致,但性能較低。
  • 實際應用中,建議根據業務特性混合使用不同模式(如核心鏈路用 XA,例如轉賬等功能,非核心用 AT),并結合監控系統及時發現和處理異常。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906918.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906918.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906918.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GAMES104 Piccolo引擎搭建配置

操作系統:windows11 家庭版 inter 17 12 th 顯卡:amd 運行內存:>12 1、如何構建? 在github下載:網址如下 https://github.com/BoomingTech/Piccolo 下載后安裝 git、vs2022 Git Visual Studio 2022 IDE - …

頁表:從虛擬內存到物理內存的轉換

目錄 引言 虛擬內存 頁表 單級頁表 頁表項 單級頁表的不足 二級頁表 四級頁表 快表TLB 結語 引言 一個系統中,CPU和內存是被所有進程共享的,而且一個系統中往往運行著多個進程。如果一個進程不小心寫了另一個進程的內存,那么被寫入…

互聯網大廠Java求職面試:短視頻平臺大規模實時互動系統架構設計

互聯網大廠Java求職面試:短視頻平臺大規模實時互動系統架構設計 面試背景介紹 技術總監(嚴肅臉): 歡迎來到我們今天的模擬面試,我是技術部的李總監,負責平臺后端架構和高可用系統設計。今天我們將圍繞一個…

網絡段、主機段、子網掩碼

子網掩碼把 IP 切割成了網絡段和主機段兩部分。同一網段下的不同主機之間可以互通網絡。 掩碼 IPV4 默認情況下 IP 地址 192.168.0.x 可以分配 256 個主機地址(不考慮首尾兩個特殊的地址時)。 假設我們只需要用到 8 個主機,就可以借助子網掩…

從零搭建SpringBoot Web 單體項目2、SpringBoot 整合數據庫

系列文章 從零搭建SpringBoot Web單體項目【基礎篇】1、IDEA搭建SpringBoot項目 從零搭建 SpringBoot Web 單體項目【基礎篇】2、SpringBoot 整合數據庫 目錄 一、項目基礎環境說明 二、數據庫整合流程 1. 添加 MyBatis-Plus 相關依賴(pom.xml) 2…

4款頂級磁力下載工具,速度提升器,可以變下變播

今天給大家帶來一些超給力的磁力下載工具,速度飛快,最高可達20MB/s,而且還能邊下邊播! 下載鏈接:夸克網盤分享(點擊藍色字體自行保存下載) 一、柚子下載 柚子下載界面干凈,沒有廣…

怎樣判斷服務器網絡質量的狀態?

服務器存儲著企業的重要數據信息,服務器的網絡質量會影響到用戶訪問數據信息的速度,也決定著網站頁面是否會出現卡頓或頁面崩潰的情況,那我們對于服務器中網絡質量的狀態該如何進行判斷呢? 服務器的網絡狀態通常是指服務器與外部網…

零基礎入門Selenium自動化測試:自動登錄edu郵箱

🌟 Selenium簡單概述一下 Selenium 是一個開源的自動化測試工具,主要用于 Web 應用程序的功能測試。它能夠模擬用戶操作瀏覽器的行為(如點擊按鈕、填寫表單、導航頁面等),應用于前端開發、測試和運維領域。 特點 跨…

day36 python神經網絡訓練

目錄 一、數據準備與預處理 二、數據集劃分與歸一化 三、構建神經網絡模型 四、定義損失函數和優化器 五、訓練模型 六、評估模型 在機器學習和深度學習的實踐中,信貸風險評估是一個非常重要的應用場景。通過構建神經網絡模型,我們可以對客戶的信用…

如何確定是不是一個bug?

在軟件測試過程中,我們經常會遇到一些異常現象,但并非所有異常都是Bug。如何準確判斷一個問題是否屬于Bug?本文將從Bug的定義、判定標準、常見誤區和實戰技巧四個方面展開,幫助測試工程師提高Bug判定的準確性。 1. Bug的定義:什么情況下算Bug? 一個Bug(缺陷)通常指軟件…

Lombok與Jackson實現高效JSON序列化與反序列化

引言 在Java開發中,處理JSON數據是常見需求,而Jackson作為廣泛使用的JSON庫,能夠高效地將Java對象與JSON互相轉換。然而,傳統的POJO(Plain Old Java Object)需要手動編寫大量樣板代碼(如getter…

論文閱讀:PURPLE: Making a Large Language Model a Better SQL Writer

論文地址:PURPLE: Making a Large Language Model a Better SQL Writer 摘要 大語言模型(LLM)技術在自然語言到 SQL(NL2SQL)翻譯中扮演著越來越重要的角色。通過大量語料訓練的 LLM 具有強大的自然語言理解能力和基本…

【圖像大模型】ControlNet:深度條件控制的生成模型架構解析

ControlNet:深度條件控制的生成模型架構解析 一、核心原理與技術突破1.1 基礎架構設計1.2 零卷積初始化1.3 多條件控制機制 二、系統架構與實現細節2.1 完整處理流程2.2 性能指標對比 三、實戰部署指南3.1 環境配置3.2 基礎推理代碼3.3 高級控制參數 四、典型問題解…

【從0到1搞懂大模型】chatGPT 中的對齊優化(RLHF)講解與實戰(9)

GPT系列模型的演進 chatgpt系列模型演進的重要節點包含下面幾個模型(當然,這兩年模型發展太快了,4o這些推理模型我就先不寫了) (Transformer) → GPT-1 → GPT-2 → GPT-3 → InstructGPT/ChatGPT(GPT-3.5) → GPT-4 下面介紹一…

2025年AEI SCI1區TOP,改進麻雀搜索算法MSSA+建筑三維重建,深度解析+性能實測

目錄 1.摘要2.麻雀搜索算法SSA原理3.整體框架4.改進SSA算法5.結果展示6.參考文獻7.代碼獲取8.讀者交流 1.摘要 對現有建筑進行高質量的三維重建對于其維護、修復和管理至關重要。圖像采集中的有效視角規劃會顯著影響基于攝影測量的三維重建質量。復雜的建筑結構常常導致傳統視…

鴻蒙開發:如何實現列表吸頂

前言 本文基于Api13 列表吸頂功能,在實際的開發中有著很大的作用,比如可以讓列表層級之間更加分明,減少一定程度上的視覺混亂,由于吸頂的標題會隨著滾動固定在頂部,可以讓用戶無需反復滑動回頂部確認分組位置&#xff…

使用Zotero的RSS訂閱功能快速了解感興趣領域最新文章

文章目錄 寫在前面中文期刊的RSS訂閱英文期刊的RSS訂閱回到Zotero有啥用? 寫在前面 作為一名研究生或者科研工作者,肯定需要經常檢索自己研究領域的最新文獻,相比于不定期的去各大數據庫檢索文獻,借助RSS訂閱功能則更加便捷。 R…

Windows安裝Docker Desktop開啟 Kubenetes制作并部署本地鏡像

1、安裝Docker Desktop docker desktop官方下載鏈接,下載后一路點下來安裝就好了。 2、制作本地鏡像 跟著docker步驟制作鏡像,需要先配置docker 鏡像源,因為網絡問題 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式學習筆記 - freeRTOS 列表,鏈表,節點跟任務之間關系

一 下圖說明了 freeRTOS 就緒列表,鏈表,節點跟任務之間關系 一個任務對應一個節點,一個鏈表對應一個優先級,一個任務根據優先級可以插入任何一個鏈表中。 插入函數為,這也是freeRTOS的核心函數,對每個任務…

scikit-learn pytorch transformers 區別與聯系

以下是 scikit-learn、PyTorch 和 Transformers 的區別與聯系的表格形式展示: 特性/庫scikit-learnPyTorchTransformers主要用途傳統機器學習算法深度學習框架預訓練語言模型與自然語言處理任務核心功能分類、回歸、聚類、降維、模型選擇等張量計算、自動微分、神經網絡構建與…