分庫分表之優缺點分析

大家好,我是工藤學編程 🦉一個正在努力學習的小博主,期待你的關注
實戰代碼系列最新文章😉C++實現圖書管理系統(Qt C++ GUI界面版)
SpringBoot實戰系列🐷【SpringBoot實戰系列】Sharding-Jdbc實現分庫分表到分布式ID生成器Snowflake自定義wrokId實戰
環境搭建大集合環境搭建大集合(持續更新)

前情摘要:
1、數據庫性能優化

本文章目錄

  • 一、分庫分表:突破數據庫性能瓶頸的原因
    • 一、數據庫連接數瓶頸問題
    • 二、單表海量數據查詢性能問題
    • 三、單臺數據庫并發訪問壓力問題
  • 二、分庫分表帶來的六大核心問題及技術挑戰
    • 一、跨節點數據庫Join與多維度查詢難題
    • 二、分布式事務一致性挑戰
    • 三、SQL排序、翻頁與函數計算的跨庫困境
    • 四、全局主鍵沖突與生成策略難題
    • 五、容量規劃與二次擴容的復雜性
    • 六、分庫分表中間件選型困境

一、分庫分表:突破數據庫性能瓶頸的原因

在這里插入圖片描述

一、數據庫連接數瓶頸問題

在數據庫與應用程序交互的過程中,每個客戶端請求都需要建立一個數據庫連接。當系統訪問量激增,或者數據庫本身設置的最大連接數過小,就會觸發 “too many connections” 錯誤。一旦連接數達到上限,后續的請求無法建立連接,系統響應速度會大幅下降,嚴重時甚至導致服務崩潰。

以 MySQL 數據庫為例:

  • 默認設置:MySQL 默認的最大連接數為 100,這個數值在一般小型項目中或許夠用,但在高并發的互聯網應用場景下,遠遠不能滿足需求。
  • 調整限制:雖然 MySQL 理論上允許的最大連接數可達 16384,但實際設置時不能盲目追求高值。因為每個連接都會占用內存等系統資源,過多的連接反而會加重服務器負擔,影響數據庫性能。

通過分庫分表,將數據分散到多個數據庫實例中,每個實例承擔的連接請求相應減少,從而有效緩解連接數瓶頸問題。例如,原本 1000 個請求集中在一個數據庫實例,分庫后可能每個實例只處理 200 個請求,降低了單個實例的連接壓力。

二、單表海量數據查詢性能問題

隨著業務的不斷推進,數據庫中部分核心表的數據量會快速增長。當單表數據量達到百萬甚至千萬級別時,即使是簡單的查詢操作,執行效率也會變得極低。這是因為全表掃描操作會消耗大量磁盤 I/O 和 CPU 資源,使得查詢響應時間顯著變長,影響用戶體驗。
通過分表,數據分散存儲,查詢操作的掃描范圍大幅縮小,查詢性能得到顯著提升。

三、單臺數據庫并發訪問壓力問題

在高并發場景下,單臺數據庫服務器的處理能力是有限的。大量的讀寫請求集中在一臺服務器上,會導致 CPU、內存、磁盤 I/O 等資源被迅速消耗,出現資源利用率過高的情況。最終,數據庫響應延遲增加,甚至可能出現服務不可用的嚴重后果。

數據庫分庫則是將數據分散存儲到多個數據庫實例中,每個實例分擔一部分業務請求。常見的分庫方式是按照業務模塊劃分,比如:

  • 將用戶相關的數據存儲在用戶數據庫;
  • 訂單數據存儲在訂單數據庫;
  • 商品數據存儲在商品數據庫。

通過這種方式,每個數據庫實例的并發訪問量降低,系統整體的并發處理能力得到極大提升,能夠更好地應對高并發請求。

二、分庫分表帶來的六大核心問題及技術挑戰

分庫分表在解決數據庫性能瓶頸的同時,也引入了一系列復雜的技術問題。以下是實踐中常見的六大挑戰及場景解析:

一、跨節點數據庫Join與多維度查詢難題

核心矛盾:數據分片后,關聯查詢與多維度查詢的復雜度呈指數級上升。

  • 傳統場景對比
    分庫前:通過單庫SQL Join輕松實現多表關聯(如SELECT * FROM orders JOIN users ON orders.uid=users.id)。
    分庫后:若ordersuser_id分片,usersdept_id分片,則跨庫Join需手動拆分SQL,甚至通過應用層聚合結果。
  • 多維度查詢痛點
    • 案例:訂單表以user_id為分片鍵,用戶查詢個人訂單時效率高,但商家查詢店鋪訂單(需按shop_id篩選)時,數據可能分散在多個庫中,需遍歷所有分片節點后聚合結果,性能損耗嚴重。

二、分布式事務一致性挑戰

問題本質:跨庫操作打破ACID特性,需引入分布式事務解決方案。

  • 典型場景
    電商場景中,用戶下單時需同時扣減庫存(庫存庫)和記錄訂單(訂單庫),若兩庫分片不同,傳統本地事務失效。
  • 技術難點
    • 強一致性方案(如2PC)性能開銷大,弱一致性方案(如最終一致性)需處理異常補償邏輯。

三、SQL排序、翻頁與函數計算的跨庫困境

具體問題表現

  • Order By排序
    若排序字段非分片鍵(如按create_time排序),需從所有分片查詢數據,各節點本地排序后再在應用層合并結果,消耗大量內存與CPU。
  • Limit翻頁
    當頁碼較大時(如LIMIT 10000,10),各分片需返回前10010條數據,應用層合并后再取后10條,產生“深度分頁”性能問題。
  • 函數計算
    跨庫聚合函數(如COUNT(*)SUM(amount))需先在各分片計算局部結果,再匯總全局值,增加網絡傳輸開銷。

四、全局主鍵沖突與生成策略難題

傳統自增ID失效場景

  • 分庫前:單庫自增ID可保證唯一性(如AUTO_INCREMENT)。
  • 分庫后:若多個庫均使用自增ID,會導致不同庫中出現相同ID(如庫1和庫2的訂單表均生成ID=1001)。
    解決方案挑戰
  • 雪花算法(Snowflake)需保證時鐘同步,分布式ID生成器(如UUID)存在無序性與存儲冗余問題。

五、容量規劃與二次擴容的復雜性

業務增長帶來的動態挑戰

  • 初次分庫時若分片數量設計不足(如按10萬數據/庫規劃),當數據量突破1000萬時需重新分片(如擴容至100庫)。
  • 二次擴容需解決數據遷移問題:
    • 全量遷移:停機遷移數據,但影響服務可用性。
    • 增量遷移:需處理遷移期間的增量數據同步,避免數據不一致。

六、分庫分表中間件選型困境

主流技術對比與選型難點

中間件類型代表產品優勢短板
客戶端代理Sharding-JDBC無額外組件,與應用同進程部署需修改應用代碼,運維成本高
服務端代理MyCAT應用無感知,支持多數據庫協議單點性能瓶頸,版本迭代緩慢
云原生方案OceanBase自動分片與擴容,高可用性學習成本高,適用于大型企業

后續將針對每個問題展開具體解決方案,歡迎關注技術連載!

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

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

相關文章

【2025年超詳細】Git 系列筆記-4 git版本號及git相關指令運用。

系列筆記 【2025年超詳細】Git 系列筆記-1 Git簡述、Windows下git安裝、Linux下git安裝_displaying 2e144 commits. adjust this setting in -CSDN博客 【2025年超詳細】Git 系列筆記-2 github連接超時問題解決_2025訪問github-CSDN博客 【2025年超詳細】Git 系列筆記-3 Git…

圖像特征檢測算法SuperPoint和SuperGlue

SuperPoint 背景與概述 :SuperPoint 是一個自監督的全卷積神經網絡,用于提取圖像中的興趣點及其描述子。它在 2018 年由 Magic Leap 提出,通過在合成數據集上預訓練一個基礎檢測器 MagicPoint,然后利用同胚適應技術對真實圖像數據…

nginx 和 springcloud gateway cors 跨域如何設置

在跨域資源共享(CORS)配置中,Nginx 和 API Gateway(如Spring Cloud Gateway、Kong等)是兩種常見的解決方案,它們的配置邏輯和適用場景有所不同。以下是詳細對比和配置示例: 一、核心區別 維度NginxAPI Gateway定位反向代理/Web服務器微服務流量入口配置位置基礎設施層應…

電路筆記(信號):一階低通RC濾波器 一階線性微分方程推導 拉普拉斯域表達(傳遞函數、頻率響應)分析

目錄 RC 低通濾波器電路一階線性微分方程推導拉普拉斯域表達(傳遞函數)傳遞函數 H ( s ) H(s) H(s)頻率響應(令 s j ω s j\omega sjω)幅頻特性:相位特性:Bode 圖(線性系統頻率響應&#x…

【Git】刪除遠程分支時,本地分支還能看到

當遠程倉庫的分支被刪除后,本地通過 git branch -a 或 git remote show origin 仍能看到這些分支的引用,是因為本地存儲的遠程跟蹤分支(位于 refs/remotes/origin/)未被同步更新。以下是解決方法: 解決方案&#xff1…

Cubase 通過 MIDIPLUS MIDI 鍵盤進行走帶控制的設置方法

第一步,在官網下載xml配置文件。 https://midiplus.com/upload/202101/29/Xpro & Xpro_mini控制腳本(Cubase).zip 第二步,Cubase中按如圖步驟添加映射。 將MIDI鍵盤連接到電腦后打開Cubase軟件,點選菜單“工作室”->“工作室設置”&…

第十八章 Linux之Python定制篇——Python開發平臺Ununtu

1. Ubuntu介紹 Ubuntu(友幫拓、優般圖、烏班圖)是一個以桌面應用為主的開源GUN/Linux操作系統,Ubuntu基于GUN/Linux,支持x86、amd64(即x64)和ppc架構,有全球專業開發團隊(Canonical…

推薦輕量級文生視頻模型(Text-to-Video)

1. ModelScope T2V by 阿里達摩院(推薦) 模型名:damo/text-to-video-synthesis 輸入:一句文字描述(如:"a panda is dancing") 輸出:2秒視頻(16幀&#xff0c…

流編輯器sed

sed簡介 sed是一種流編輯器,處理時,把當前處理的行存儲在臨時緩沖區中,稱為模式空間,接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下行,這樣不斷重復&#xf…

商用密碼基礎知識介紹(上)

一、密碼的基礎知識 1、密碼分類 根據《中華人民共和國密碼法》,國家對密碼實行分類管理,分為密碼分為核心密碼、普通密碼和商用密碼。 (1)核心密碼、普通密碼 核心密碼、普通密碼用于保護國家秘密信息,核心密碼保護…

PROFINET主站S7-1500通過協議網關集成歐姆龍NJ系列TCP/IP主站

一、項目背景 某大型新能源電池生產企業,致力于提升電池生產的自動化水平和智能化程度。其生產線上,部分關鍵設備采用了不同的通信協議。在電池生產的前段工序,如原材料攪拌、涂布等環節,使用了西門子S7-1500系列PLC作為ROFINET協…

Vue3 + TypeScript + Element Plus + el-input 輸入框列表按回車聚焦到下一行

應用效果:從第一行輸入1,按回車,聚焦到第二行輸入2,按回車,聚焦到第三行…… 一、通過元素 id,聚焦到下一行的輸入框 關鍵技術點: 1、動態設置元素 id 屬性為::id"input-appl…

FramePack 全面測評:革新視頻生成體驗

在 AI 視頻生成領域,FramePack 自問世便備受矚目,它憑借獨特的技術架構,號稱能打破傳統視頻生成對高端硬件的依賴,讓普通電腦也能產出高質量視頻。此次測評,我們將全方位剖析 FramePack,探究它在實際應用中…

html中的table標簽以及相關標簽

表格標簽可以通過指定的標簽完成數據展示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表格標簽</title> </head> <body><table border"2"><!-- tr是表行 r…

springboot+vue3+vue-simple-uploader輕松實現大文件分片上傳Minio

最近在寫視頻課程的上傳&#xff0c;需要上傳的視頻幾百MB到幾個G不等&#xff0c;普通的上傳都限制了文件的大小&#xff0c;況且上傳的文件太大的話會超時、異常等。所以這時候需要考慮分片上傳了&#xff0c;把需要上傳的視頻分成多個小塊上傳到&#xff0c;最后再合并成一個…

AI 重構代碼實戰:如何用飛算 JavaAI 快速升級遺留系統?

在企業數字化進程中&#xff0c;遺留系統如同陳舊的基礎設施&#xff0c;雖承載著重要業務邏輯&#xff0c;但因技術落后、架構復雜&#xff0c;升級維護困難重重。飛算 JavaAI 的出現&#xff0c;為遺留系統的二次開發帶來了新的轉機&#xff0c;其基于智能分析與關聯項目的技…

鴻蒙運動開發實戰:打造專屬運動視頻播放器

##鴻蒙核心技術##運動開發##Media Kit&#xff08;媒體服務&#xff09;# 在當今數字化時代&#xff0c;運動健身已經成為許多人生活的一部分。今天我將在應用中添加視頻播放器&#xff0c;幫助用戶在運動前、運動后更好地進行熱身和拉伸。這篇文章將從代碼核心點入手&#xf…

一個包含15個界面高質量的電商APP客戶端UI解決方案

一個包含15個界面高質量的電商APP客戶端UI解決方案 您可以將其用于電商APP應用項目。包含一系列完整的界面設計元素&#xff0c;包括歡迎頁、登錄、注冊、首頁、產品分類、產品詳情、尺碼選擇、購物車、訂單、支付&#xff0c;覆蓋電商APP的大部分界面。每個部分都精心設計&…

執行 PGPT_PROFILES=ollama make run下面報錯,

執行 PGPT_PROFILESollama make run 下面報錯&#xff0c; File "/home/powersys/.cache/pypoetry/virtualenvs/private-gpt-ZIwX6JeM-py3.11/lib/python3.11/site-packages/qdrant_client/http/api_client.py", line 108, in send_inner raise ResponseHandling…

【Docker基礎】Docker核心概念:命名空間(Namespace)之User詳解

目錄 引言 1 基礎概念回顧 1.1 命名空間概述 1.2 命名空間的類型 2 User命名空間詳解 2.1 基本概念 2.2 工作原理 User命名空間的工作流程 User命名空間架構 3 應用場景 4 配置與使用 5 總結 引言 隨著容器化技術的廣泛應用&#xff0c;Docker已成為現代軟件開發、…