分庫分表的取舍

文章目錄

  • 大數據量下采用**水平分表**的缺點
      • **1. 跨表查詢復雜性與性能下降**
      • **2. 數據分布不均衡**
      • **3. 分布式事務與一致性問題**
      • **4. 擴展性受限**
      • **5. 查詢條件限制與索引管理復雜**
      • **6. 數據遷移與維護成本高**
      • **7. 業務邏輯復雜度增加**
      • **總結**
  • shardingJdbc分片策略
      • **1. 標準分片策略(Standard)**
      • **2. 復合分片策略(Complex)**
      • **3. 行表達式分片策略(Inline)**
      • **4. Hint分片策略(Hint)**
      • **5. 不分片策略(None)**
      • **分片策略選擇建議**
      • **注意事項**
  • shardingJdbc和shardingProxy的區別
      • **1. 架構與部署方式**
      • **2. 侵入性與透明性**
      • **3. 性能對比**
      • **4. 配置與管理**
      • **5. 功能支持**
      • **6. 適用場景**
      • **7. 配置示例對比**
        • **Sharding-JDBC(YAML配置)**
        • **Sharding-Proxy(server.yaml配置)**
      • **總結選擇建議**

大數據量下采用水平分表的缺點

1. 跨表查詢復雜性與性能下降

  • 問題:當查詢需要跨多個分表(如 JOIN 操作或跨分表的聚合查詢)時,需合并多個表的結果,導致查詢邏輯復雜化,且性能顯著下降。
    • 原因:水平分表后,數據分散在不同表或不同數據庫中,傳統的 SQL 語句無法直接關聯這些分表,需要應用層或中間件處理,增加了網絡開銷和計算復雜度。
    • 示例:若用戶訂單表按 用戶ID 分表,查詢某用戶的歷史訂單需遍歷所有分表,或需應用層合并結果。

2. 數據分布不均衡

  • 問題:若分表規則設計不合理(如按時間范圍或固定區間分表),可能導致某些分表數據量遠超其他分表,引發資源不均衡。
    • 原因
      • 熱點分表:例如按時間范圍分表時,新數據可能集中在最新分表,導致寫入壓力集中(如交易流水表)。
      • 哈希分表的局限性:若業務數據天然存在分布不均(如某些用戶數據量遠超其他用戶),哈希分表可能無法完全避免傾斜。
    • 影響:部分分表成為性能瓶頸,甚至引發單點故障。

3. 分布式事務與一致性問題

  • 問題:跨分表的事務操作難以保證原子性和一致性。
    • 原因
      • 水平分表后,若數據分布在不同數據庫或節點上,需依賴分布式事務(如兩階段提交,2PC),但會顯著增加延遲和復雜度。
      • MySQL 本身不支持跨分表的事務,需通過應用層或中間件實現,可能導致性能下降或數據不一致風險。
    • 示例:轉賬操作涉及兩個用戶的分表,若其中一個分表操作失敗,需手動回滾,容易引發數據不一致。

4. 擴展性受限

  • 問題:擴容或調整分表策略時面臨挑戰。
    • 哈希分表的擴展問題
      • 若分表數量增加(如從3個分表擴展到4個),需重新計算所有數據的哈希值并遷移數據,導致停機或性能下降(如[5]中一致性哈希的復雜性)。
    • 范圍分表的擴展問題
      • 新增分表需定義新的范圍,但歷史數據無法自動遷移,可能需手動調整查詢邏輯。

5. 查詢條件限制與索引管理復雜

  • 問題
    • 查詢條件依賴分片鍵:若查詢條件不包含分片鍵(如按 訂單金額 查詢),需全表掃描所有分表,性能極差。
    • 索引維護成本高:每個分表需獨立維護索引,索引碎片化和維護成本成倍增加。
  • 示例:若分片鍵是 用戶ID,但業務需按 商品ID 查詢,則需掃描所有分表。

6. 數據遷移與維護成本高

  • 問題
    • 初始分表成本:將原有大表拆分為多個分表并遷移數據,需停機或復雜的數據遷移工具支持。
    • 后期維護復雜:備份、恢復、數據遷移、索引優化等操作需針對每個分表單獨執行,管理成本顯著上升(如[3]提到的“數據庫維護復雜”)。

7. 業務邏輯復雜度增加

  • 問題
    • 路由邏輯復雜:需在應用層或中間件實現分片鍵到具體分表的映射(如哈希計算、范圍判斷)。
    • 中間表映射的缺陷:若依賴中間表記錄分片規則,可能引發中間表數據膨脹或查詢性能下降(如[5]提到的中間表映射策略的缺點)。

總結

水平分表在解決單表數據量過大、提升查詢性能和擴展性方面有顯著優勢,但其缺點主要集中在跨分片操作復雜性、數據分布不均、事務一致性挑戰、擴展性限制以及維護成本上升。因此,在實施水平分表時需謹慎設計分片策略(如選擇合適的分片鍵、采用一致性哈希等),并結合垂直分表、緩存、讀寫分離等方案綜合優化系統架構。

shardingJdbc分片策略

ShardingJDBC的分片策略是其核心功能之一,用于實現數據分庫分表的路由邏輯。根據知識庫中的信息,以下是 分片策略的分類、特點及使用場景 的詳細說明:


1. 標準分片策略(Standard)

  • 定義:適用于單一分片鍵的場景,支持 精確查詢=, IN)和 范圍查詢BETWEEN, >, < 等)。

  • 配置要求

    • 必須指定 分片鍵shardingColumn)和 分片算法名稱shardingAlgorithmName)。
    • 支持兩種算法:
      • 精準分片算法PreciseShardingAlgorithm):處理 =IN 的查詢,必須實現。
      • 范圍分片算法RangeShardingAlgorithm):處理 BETWEEN 等范圍查詢,可選。若未配置,范圍查詢會全庫掃描。
  • 適用場景

    • 單一字段分片(如 order_id 分庫分表)。
    • 需要支持范圍查詢的場景(如按時間范圍分表)。
  • 配置示例

    (YAML):

    yaml

    深色版本

    spring:shardingsphere:rules:sharding:tables:t_order:actual-data-nodes: db$->{0..1}.t_order_$->{0..10}databaseStrategy:standard:shardingColumn: order_idshardingAlgorithmName: db-inlinetableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: table-inline
    

2. 復合分片策略(Complex)

  • 定義:支持 多分片鍵 的組合分片,適用于跨表關聯查詢的場景。

  • 特點

    • 分片鍵為多個字段(如 user_idorder_time)。
    • 需要開發者自定義分片算法(ComplexShardingAlgorithm),直接處理分片鍵的組合邏輯。
    • 適用于綁定表(如 t_ordert_order_item)的關聯查詢,避免笛卡爾積。
  • 適用場景

    • 需要多條件聯合分片的復雜查詢(如 user_idorder_time)。
    • 綁定表的跨表關聯查詢。
  • 注意事項

    • 復合分片會增加路由復雜度,需確保分片鍵組合能均勻分布數據。
    • 需自行實現分片算法邏輯。

3. 行表達式分片策略(Inline)

  • 定義:通過 Groovy表達式 簡化分片配置,無需編寫Java代碼。

  • 特點

    • 支持單分片鍵,僅支持 =IN 的精確查詢(不支持范圍查詢)。
    • 表達式語法示例:t_order_${order_id % 4}
  • 適用場景

    • 簡單的分片規則(如取模分表)。
    • 避免編寫復雜算法的場景。
  • 配置示例

    (YAML):

    yaml

    深色版本

    spring:shardingsphere:rules:sharding:tables:t_order:actual-data-nodes: db0.t_order_$->{0..3}tableStrategy:inline:shardingColumn: order_idalgorithmExpression: t_order_${order_id % 4}
    

4. Hint分片策略(Hint)

  • 定義:通過 代碼提示 指定分片目標,無需依賴SQL解析。

  • 特點

    • 適用于無法通過SQL解析獲取分片鍵的場景(如動態路由)。
    • 需配合 HintManager API 顯式指定分片值。
  • 適用場景

    • 需要動態指定分片的場景(如根據用戶ID路由到特定庫表)。
    • 避免SQL解析限制的場景(如SQL中包含函數或復雜表達式)。
  • 使用示例

    (Java代碼):

    java

    深色版本

    try (Connection conn = dataSource.getConnection()) {HintManager hintManager = HintManager.getInstance();hintManager.addDatabaseShardingValue("t_order", "user_id", 1001);// 執行SQL
    }
    

5. 不分片策略(None)

  • 定義:指定某張表或某個操作 不分片,數據全部存儲在單個庫表中。

  • 適用場景

    • 廣播表(如字典表、配置表)。
    • 特定操作需要跨分片聚合時,需將結果匯總到單表。
  • 配置示例

    (YAML):

    yaml

    深色版本

    spring:shardingsphere:rules:sharding:tables:t_dict:databaseStrategy:none: {}tableStrategy:none: {}
    

分片策略選擇建議

  1. 單分片鍵 + 精準/范圍查詢標準分片策略
  2. 多分片鍵組合分片復合分片策略
  3. 簡單規則(如取模)行表達式分片策略
  4. 動態路由或復雜場景Hint分片策略
  5. 廣播表或無需分片的表不分片策略

注意事項

  • 范圍查詢風險:若標準分片策略未配置范圍分片算法,范圍查詢會全庫掃描,性能極差。
  • 復合分片復雜度:需確保多分片鍵的組合能均勻分布數據,避免熱點。
  • SQL兼容性:某些SQL函數或操作符可能導致分片失效,需避免使用或結合Hint策略。

shardingJdbc和shardingProxy的區別

1. 架構與部署方式

特性Sharding-JDBCSharding-Proxy
定位Java框架,以JAR包形式集成到應用中獨立的數據庫代理服務器,無需修改應用代碼
部署方式直接嵌入應用,與應用進程共存獨立部署為中間件服務,應用通過代理連接
網絡通信應用直接連接數據庫,一次網絡跳轉應用連接Proxy,Proxy再連接數據庫,兩次網絡跳轉

2. 侵入性與透明性

特性Sharding-JDBCSharding-Proxy
侵入性需要在應用中集成配置,對應用有一定侵入性對應用完全透明,無需修改代碼,無侵入性
透明性僅支持Java應用,需依賴Sharding-JDBC驅動支持任何兼容MySQL/PostgreSQL協議的客戶端

3. 性能對比

特性Sharding-JDBCSharding-Proxy
網絡開銷一次網絡跳轉(應用直連數據庫)兩次網絡跳轉(應用→Proxy→數據庫),性能略低
適用場景高性能OLTP場景(如高頻交易系統)OLAP分析、運維管理、多語言支持場景

4. 配置與管理

特性Sharding-JDBCSharding-Proxy
配置方式通過代碼或Spring配置文件(如YAML/XML)通過配置文件(如server.yaml)或注冊中心(如ZooKeeper)動態配置
動態調整需重啟應用或重新加載配置支持熱更新,無需重啟Proxy
管理友好性開發者主導,適合開發階段對DBA友好,支持工具(如ShardingSphere-UI)

5. 功能支持

特性Sharding-JDBCSharding-Proxy
分片能力完全支持分庫分表、讀寫分離、柔性事務等完全支持分庫分表、讀寫分離、柔性事務等
多語言支持僅支持Java生態(如Spring、MyBatis)支持任何MySQL/PostgreSQL客戶端(如Python、Go、Navicat)
分布式治理支持配置中心、熔斷、動態失效轉移同樣支持,但通過代理層實現
SQL兼容性完全兼容JDBC和ORM框架兼容MySQL/PostgreSQL協議,需注意SQL語法限制

6. 適用場景

場景推薦使用Sharding-JDBC推薦使用Sharding-Proxy
技術棧純Java應用(如Spring Boot)多語言應用、需要DBA管理或第三方工具訪問
性能要求高并發、低延遲的OLTP場景分析查詢、運維管理、跨語言協作場景
擴展性需求需要與應用強耦合,快速迭代需要集中管理分片規則,支持動態調整

7. 配置示例對比

Sharding-JDBC(YAML配置)
spring:shardingsphere:datasource:names: ds0, ds1ds0:url: jdbc:mysql://localhost:3306/ds0username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverrules:sharding:tables:t_order:actual-data-nodes: ds$->{0..1}.t_order_$->{0..2}table-strategy:standard:sharding-column: order_idsharding-algorithm-name: t_order-inlinesharding-algorithms:t_order-inline:type: INLINEprops:algorithm-expression: t_order_$->{order_id % 3}
Sharding-Proxy(server.yaml配置)
schema-name: sharding_db
dataSources:ds0:url: jdbc:mysql://localhost:3306/ds0username: rootpassword: rootconnectionTimeoutSeconds: 30idleTimeoutSeconds: 60maxLifetimeSeconds: 1800maxPoolSize: 50
shardingRule:tables:t_order:actualDataNodes: ds$->{0..1}.t_order_$->{0..2}tableStrategy:standard:shardingColumn: order_idshardingAlgorithmName: t_order_inlineshardingAlgorithms:t_order_inline:type: INLINEprops:algorithm-expression: t_order_$->{order_id % 3}

總結選擇建議

  • 選Sharding-JDBC

    • 純Java應用,追求高性能和低延遲。
    • 需要與業務代碼深度集成,如Spring Boot項目。
    • 對分片規則的動態調整需求較低,或能接受重啟應用。
  • 選Sharding-Proxy

    • 多語言應用或需要DBA直接管理分片規則。
    • 需要動態調整分片策略且無需重啟服務。
    • 需要通過工具(如Navicat、MySQL Workbench)直接操作分片數據。

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

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

相關文章

Vue3解決“找不到模塊@/components/xxx.vue或其相應的類型聲明ts文件(2307)”

問題 1&#xff1a;如果沒有這個env.d.ts文件&#xff0c;就新建 declare module "*.vue" {import { DefineComponent } from "vue";const component: DefineComponent<{}, {}, any>;export default component; }2&#xff1a;如果有tsconfig.json文…

計算機視覺與深度學習 | 基于MATLAB的圖像特征提取與匹配算法總結

基于MATLAB的圖像特征提取與匹配算法全面指南 圖像特征提取與匹配 基于MATLAB的圖像特征提取與匹配算法全面指南一、圖像特征提取基礎特征類型分類二、點特征提取算法1. Harris角點檢測2. SIFT (尺度不變特征變換)3. SURF (加速魯棒特征)4. FAST角點檢測5. ORB (Oriented FAST …

如何通過API接口獲取淘寶商品列表?操作詳解

一、準備工作 注冊開發者賬號 訪問淘寶開放平臺官網/萬邦開放平臺&#xff0c;完成企業開發者認證&#xff08;個人賬號權限受限&#xff09;&#xff0c;使用已有淘寶賬號可直接登錄。創建應用并填寫基本信息&#xff08;如應用名稱、類型等&#xff09;&#xff0c;系統生成A…

大數據驅動企業決策智能化的路徑與實踐

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;數據驅動的企業競爭力重構 在這個瞬息萬變的商業時代&#xff0c;“快者勝”的競爭邏輯愈發明顯。企業如何在復雜環…

DataGridView關閉默認第一列及表頭居中設置

1、關閉默認第一列 如上圖所示&#xff0c;C#和VB.net中的DataGridView控件都是有一個默認的第一列&#xff08;雖然是空白&#xff09;的&#xff0c;如何關閉這個默認列呢&#xff1f; 把“RowHeadersVisible”的值設置成“false”就可以了&#xff1a; 2、表頭居中顯示 如上…

nodejs express 打包部署

當前文件路徑 webpack.config.js const path require(path); module.exports {entry: ./app.js, // Express 入口文件target: node, // 指定 Node.js 環境output: {path: path.resolve(__dirname, dist),filename: bundle.js},mode: production };打包命令 npx webpac…

CentOS 7 修改為靜態 IP 地址完整指南

在企業網絡環境中,服務器通常需要配置靜態 IP 地址以確保網絡連接的穩定性和可管理性。以下是使用 NetworkManager 工具在 CentOS 7 系統中將動態 IP 配置修改為靜態 IP 的完整指南: 一、檢查當前網絡配置 查看網絡連接狀態: 使用 nmcli connection show 命令列出所有網絡連…

微信小程序動態組件加載的應用場景與實現方式

動態組件加載的應用場景與實現方式 你提供的代碼展示了微信小程序中動態加載組件的方法&#xff0c;但這種方式在實際開發中需要注意使用場景和實現細節。下面我來詳細說明如何應用&#xff1a; 應用場景 按需加載組件&#xff1a;在某些條件滿足時才加載組件動態配置組件&a…

學習記錄: 使用react-router-dom

假設有一個vite創建的react項目,先npm install react-router-dom. 在app中: import { RouterProvider, createBrowserRouter } from "react-router-dom"; import Login from "./comm/Login"; import Home from "./comm/Home"; import TotalMan…

Angular中Webpack與ngx-build-plus 淺學

Webpack 在 Angular 中的概念 Webpack 是一個模塊打包工具&#xff0c;用于將多個模塊和資源打包成一個或多個文件。在 Angular 項目中&#xff0c;Webpack 負責將 TypeScript、HTML、CSS 等文件打包成瀏覽器可以理解的 JavaScript 文件。Angular CLI 默認使用 Webpack 進行項目…

java中word快速轉pdf

java中word快速轉pdf 網上其他方法轉pdf要不轉的太慢&#xff0c;要不就是損失格式&#xff0c;故而留下此方法留作備用。 文章目錄 java中word快速轉pdf一、依賴二、依賴包三、代碼 一、依賴 <dependency><groupId>com.aspose</groupId><artifactId>…

Maven 概述、安裝、配置、倉庫、私服詳解

目錄 1、Maven 概述 1.1 Maven 的定義 1.2 Maven 解決的問題 1.3 Maven 的核心特性與優勢 2、Maven 安裝 2.1 下載 Maven 2.2 安裝配置 Maven 2.3 測試安裝 2.4 修改 Maven 本地倉庫的默認路徑 3、Maven 配置 3.1 配置本地倉庫 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…

Unity使用代碼分析Roslyn Analyzers

一、創建項目&#xff08;注意這里不要選netstandard2.1會有報錯&#xff09; 二、NuGet上安裝Microsoft.CodeAnalysis.CSharp 三、實現[Partial]特性標注的類&#xff0c;結構體&#xff0c;record必須要partial關鍵字修飾 需要繼承DiagnosticAnalyzer 注意一定要加特性Diagn…

knife4j:4.3.0 default-flat-param-object: true 沒有生效

Get 方式請求 前端接口文檔中的鍵值對方式&#xff08;get&#xff09;發送對象參數&#xff0c;將對象請求參數展開

C++.OpenGL (15/64)Assimp(Open Asset Import Library)

Assimp(Open Asset Import Library) 3D模型加載核心流程 #mermaid-svg-cKmTZDxPpROr7ly1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cKmTZDxPpROr7ly1 .error-icon{fill:#552222;}#mermaid-svg-cKmTZDxPpROr…

課堂筆記:吳恩達的AI課(AI FOR EVERYONE)-第一周part2 人工智能術語人工智能公司應該怎么做

人工智能術語&人工智能公司應該怎么做 一、人工智能術語 1.機器學習&#xff1a; 讓電腦能夠不用開發軟件&#xff0c;而自主獲取某種能力的研究領域。 2.數據科學&#xff1a; 從數據中提取知識和見解的科學&#xff1b; 3.深度學習&#xff1a; 度學習是一種機器…

【服務器壓力測試】本地PC電腦作為服務器運行時出現卡頓和資源緊張(Windows/Linux)

要讓本地PC電腦作為服務器運行時出現卡頓和資源緊張的情況&#xff0c;可以通過以下幾種方式模擬或觸發&#xff1a; 1. 增加CPU負載 運行大量計算密集型任務&#xff0c;例如&#xff1a; 使用多線程循環執行復雜計算&#xff08;如數學運算、加密解密等&#xff09;。運行圖…

鴻蒙開發——如何修改模擬器的顯示圖標/標題

1.圖標 第一步&#xff1a;將你所需要的圖標方到src/main/resources/base/media下 第二步&#xff1a;找到entry項目下面的src/main/module.json5 第三步&#xff1a;將原來的 "icon": "$media:layered_image", 切換成 "icon": "$media…

音樂“穿梭機”AudioRelay,讓你的音頻“無縫對接”

嘿&#xff0c;小伙伴們&#xff01;今天電腦天空給大家安利一款超神奇的音頻小能手——AudioRelay&#xff01;要是你和我一樣&#xff0c;經常在各種設備之間“折騰”音頻&#xff0c;那這玩意兒絕對能讓你眼前一亮。 你有沒有遇到過這樣的煩心事兒&#xff1f;電腦里正放著…

Chrome二級標簽無法選中的解決方案

問題描述 近段時間&#xff0c;我的chrome軟件選擇標簽時候&#xff0c;發現&#xff0c;二級文件夾下的標簽都無法選中。并且右上角三個點里面書簽的下轄子項目也根本無法選中。這就導致我連目錄也無法導出來。后來發現ctrlshiftO才調出來書簽界面&#xff0c;導出了chrome的…