最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL分區(qū)分表實(shí)現(xiàn)方法示例詳解

 更新時(shí)間:2025年10月11日 09:25:18   作者:muxin-始終如一  
ShardingSphere-JDBC通過(guò)在應(yīng)用層進(jìn)行數(shù)據(jù)分片,可以幫你輕松實(shí)現(xiàn)分區(qū)、分表和分庫(kù),下面我用具體的配置和代碼示例來(lái)說(shuō)明如何使用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

ShardingSphere-JDBC 通過(guò)在應(yīng)用層進(jìn)行數(shù)據(jù)分片,可以幫你輕松實(shí)現(xiàn)分區(qū)、分表和分庫(kù),下面我用具體的配置和代碼示例來(lái)說(shuō)明如何使用。

?? 特別注意:以下示例基于 ShardingSphere-JDBC 5.x 版本(Spring Boot Starter)配置。實(shí)際使用時(shí),請(qǐng)確保你的依賴版本匹配。以下示例主要展示核心配置和邏輯,實(shí)際應(yīng)用請(qǐng)參考官方文檔并根據(jù)業(yè)務(wù)調(diào)整。

為了讓你對(duì)這幾種分片方式有個(gè)快速的了解,我先用一個(gè)表格來(lái)匯總它們的主要特點(diǎn)和區(qū)別:

特性分表分庫(kù)分區(qū)(按特定規(guī)則如時(shí)間)
數(shù)據(jù)分布同一庫(kù)中多表不同庫(kù)中表同一庫(kù)或多庫(kù)中按規(guī)則分表
性能影響減輕單表壓力減輕單庫(kù)壓力(可配合不同服務(wù)器)常用于按時(shí)間歸檔,優(yōu)化查詢和管理
配置要點(diǎn)指定分表算法指定分庫(kù)算法通常需要自定義復(fù)合分片算法
適用場(chǎng)景單庫(kù)數(shù)據(jù)量大數(shù)據(jù)量大且并發(fā)高,需分散IO數(shù)據(jù)有明顯冷熱特征,需定期歸檔

?? 分庫(kù)分表依賴

首先,確保你的 pom.xml 包含以下依賴(以 Spring Boot Starter 為例):

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>5.2.1</version> <!-- 請(qǐng)使用最新穩(wěn)定版本 -->
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

?? 核心概念與配置示例

1. 水平分表 (Horizontal Table Sharding)

概念:將一個(gè)邏輯表的數(shù)據(jù),按照某種規(guī)則拆分到同一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)物理表中。

YAML 配置示例

spring:
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0
        username: root
        password: 123456
    rules:
      sharding:
        tables:
          t_order: # 邏輯表名
            actual-data-nodes: ds0.t_order_$->{0..1} # 實(shí)際數(shù)據(jù)節(jié)點(diǎn),ds0庫(kù)下t_order_0, t_order_1兩張表
            table-strategy:
              standard:
                sharding-column: order_id # 分片字段
                sharding-algorithm-name: table-inline # 分表算法名稱
        sharding-algorithms:
          table-inline:
            type: INLINE
            props:
              algorithm-expression: t_order_$->{order_id % 2} # 分片算法表達(dá)式,按order_id取模分到兩個(gè)表
    props:
      sql-show: true # 打印SQL,方便調(diào)試

代碼使用
配置好后,在代碼中操作邏輯表 t_order 即可,ShardingSphere-JDBC 會(huì)自動(dòng)路由到具體的物理表。

@Autowired
private JdbcTemplate jdbcTemplate;
public void demo() {
    // 插入一條order_id為123的訂單,根據(jù) 123 % 2 = 1,會(huì)路由到 t_order_1 表
    String sql = "INSERT INTO t_order (order_id, user_id, amount) VALUES (?, ?, ?)";
    jdbcTemplate.update(sql, 123L, 1000L, 200.00);
    // 查詢order_id為123的訂單,同樣會(huì)路由到 t_order_1 表
    List<Map<String, Object>> orders = jdbcTemplate.queryForList("SELECT * FROM t_order WHERE order_id = ?", 123L);
}

2. 水平分庫(kù) (Horizontal Database Sharding)

概念:將一個(gè)邏輯表的數(shù)據(jù),按照某種規(guī)則拆分到多個(gè)不同的數(shù)據(jù)庫(kù)中(每個(gè)數(shù)據(jù)庫(kù)可以包含該邏輯表的一個(gè)或多個(gè)物理表)。

YAML 配置示例

spring:
  shardingsphere:
    datasource:
      names: ds0, ds1 # 定義兩個(gè)數(shù)據(jù)源
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0
        username: root
        password: 123456
      ds1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds1
        username: root
        password: 123456
    rules:
      sharding:
        tables:
          t_order:
            # 實(shí)際數(shù)據(jù)節(jié)點(diǎn),兩個(gè)庫(kù),每個(gè)庫(kù)一張表(也可每個(gè)庫(kù)多張表)
            actual-data-nodes: ds$->{0..1}.t_order
            database-strategy: # 分庫(kù)策略
              standard:
                sharding-column: user_id # 分庫(kù)字段
                sharding-algorithm-name: database-inline # 分庫(kù)算法名稱
        sharding-algorithms:
          database-inline:
            type: INLINE
            props:
              algorithm-expression: ds$->{user_id % 2} # 按user_id取模分庫(kù)
    props:
      sql-show: true

代碼使用
操作邏輯表 t_order,ShardingSphere-JDBC 根據(jù) user_id 自動(dòng)路由到對(duì)應(yīng)的數(shù)據(jù)庫(kù)。

@Autowired
private JdbcTemplate jdbcTemplate;
public void demo() {
    // 插入一條user_id為1001的訂單,根據(jù) 1001 % 2 = 1,會(huì)路由到 ds1 庫(kù)的 t_order 表
    String sql = "INSERT INTO t_order (order_id, user_id, amount) VALUES (?, ?, ?)";
    jdbcTemplate.update(sql, 456L, 1001L, 300.00);
    // 查詢user_id為1001的訂單,同樣會(huì)路由到 ds1 庫(kù)
    List<Map<String, Object>> orders = jdbcTemplate.queryForList("SELECT * FROM t_order WHERE user_id = ?", 1001L);
}

3. 分區(qū)(自定義復(fù)合分片策略)

概念:這里的"分區(qū)"可以理解為更復(fù)雜的分片策略,例如按時(shí)間范圍(如月份)分表,可能同時(shí)結(jié)合分庫(kù)。這通常需要自定義分片算法

場(chǎng)景:訂單表按月度分表,如 t_order_202410t_order_202411

YAML 配置示例

spring:
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0
        username: root
        password: 123456
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds0.t_order_$->{202410..202412} # 假設(shè)配置未來(lái)幾個(gè)月的表
            table-strategy:
              standard:
                sharding-column: create_time # 分片字段為創(chuàng)建時(shí)間
                sharding-algorithm-name: table-time-month # 使用自定義的時(shí)間按月分表算法
        sharding-algorithms:
          table-time-month:
            type: CLASS_BASED # 使用自定義算法
            props:
              strategy: standard
              algorithmClassName: com.yourpackage.algorithm.TimeMonthShardingAlgorithm # 自定義算法類(lèi)
    props:
      sql-show: true

自定義分片算法實(shí)現(xiàn)
你需要實(shí)現(xiàn) StandardShardingAlgorithm 接口。

import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class TimeMonthShardingAlgorithm implements StandardShardingAlgorithm<LocalDateTime> {
    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<LocalDateTime> shardingValue) {
        // 處理精確分片,如 =, IN
        String logicTableName = shardingValue.getLogicTableName();
        LocalDateTime createTime = shardingValue.getValue();
        String actualTableSuffix = formatter.format(createTime); // 根據(jù)時(shí)間生成表后綴,如202410
        String actualTableName = logicTableName + "_" + actualTableSuffix; // 拼接實(shí)際表名,如t_order_202410
        // 檢查計(jì)算出的表是否存在配置中
        for (String each : availableTargetNames) {
            if (each.equals(actualTableName)) {
                return actualTableName;
            }
        }
        throw new IllegalArgumentException("No actual table found for: " + actualTableName);
    }
    @Override
    public Properties getProps() {
        return new Properties();
    }
    @Override
    public void init(Properties properties) {
        // 初始化操作,如果需要
    }
    // 注意:ShardingSphere 5.x 及以上版本,可能需要實(shí)現(xiàn)其他方法,如 `getType`。請(qǐng)根據(jù)實(shí)際版本調(diào)整。
}

代碼使用
操作邏輯表 t_order,ShardingSphere-JDBC 根據(jù) create_time 自動(dòng)路由到對(duì)應(yīng)月份的表。

@Autowired
private JdbcTemplate jdbcTemplate;
public void demo() {
    // 插入一條創(chuàng)建時(shí)間為當(dāng)前的訂單,會(huì)路由到對(duì)應(yīng)月份的表,如 t_order_202410
    String sql = "INSERT INTO t_order (order_id, user_id, amount, create_time) VALUES (?, ?, ?, ?)";
    jdbcTemplate.update(sql, 789L, 1002L, 400.00, LocalDateTime.now());
    // 查詢特定時(shí)間范圍的訂單,自定義算法中的doSharding方法會(huì)被調(diào)用
    List<Map<String, Object>> orders = jdbcTemplate.queryForList("SELECT * FROM t_order WHERE create_time BETWEEN ? AND ?", 
        LocalDateTime.of(2024, 10, 1, 0, 0), 
        LocalDateTime.of(2024, 10, 31, 23, 59));
}

?? 重要注意事項(xiàng)

  • 確保物理表和庫(kù)存在:ShardingSphere-JDBC 不會(huì)自動(dòng)創(chuàng)建配置中涉及的物理表和數(shù)據(jù)庫(kù),你需要在數(shù)據(jù)庫(kù)中手動(dòng)創(chuàng)建好。
  • 選擇合適的分片鍵:分片鍵的選擇至關(guān)重要,應(yīng)盡量選擇數(shù)據(jù)分布均勻、業(yè)務(wù)查詢常用的字段。一旦確定,修改分片規(guī)則會(huì)非常困難。
  • 避免跨庫(kù)/表關(guān)聯(lián)查詢:復(fù)雜的關(guān)聯(lián)查詢(尤其是跨庫(kù)的JOIN)在分片環(huán)境中性能很差,甚至不被支持。設(shè)計(jì)時(shí)應(yīng)盡量減少此類(lèi)操作,或考慮使用綁定表。
  • 分布式主鍵:在分片環(huán)境中,數(shù)據(jù)庫(kù)自增主鍵不再適用,建議使用 ShardingSphere 提供的分布式序列算法(如雪花算法 Snowflake)。
  • SQL 限制:ShardingSphere-JDBC 對(duì)某些復(fù)雜 SQL(如子查詢、函數(shù)的使用)支持有限,使用時(shí)需參考官方文檔的支持列表。

?? 總結(jié)

總的來(lái)說(shuō),ShardingSphere-JDBC 通過(guò)靈活的配置,讓你能以對(duì)業(yè)務(wù)代碼低侵入的方式實(shí)現(xiàn)分片。關(guān)鍵在于理解分片概念,并根據(jù)業(yè)務(wù)特點(diǎn)設(shè)計(jì)合理的分片策略。

希望這些示例能幫助你理解和使用 ShardingSphere-JDBC。如果你能分享更多具體的業(yè)務(wù)場(chǎng)景,比如數(shù)據(jù)量、增長(zhǎng)速度和常見(jiàn)的查詢模式,我可以給出更貼合的建議。

到此這篇關(guān)于MySQL分區(qū)分表實(shí)現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)mysql分區(qū)分表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 不等于的三種使用及區(qū)別

    MySQL 不等于的三種使用及區(qū)別

    MySQL中常用到判斷符號(hào),而不等于是比較常用的符號(hào),不等于主要是三種,本文主要介紹了三種的使用及區(qū)別,感興趣的同學(xué)可以了解一下
    2021-06-06
  • Mysql外鍵約束的創(chuàng)建與刪除的使用

    Mysql外鍵約束的創(chuàng)建與刪除的使用

    本文主要介紹了Mysql外鍵約束的創(chuàng)建與刪除的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Mysql中varchar類(lèi)型一些需要注意的地方

    Mysql中varchar類(lèi)型一些需要注意的地方

    這篇文章主要介紹了Mysql中varchar類(lèi)型一些需要注意的地方,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2021-01-01
  • 讓MySQL中某個(gè)表的操作不生成binlog日志的問(wèn)題解決

    讓MySQL中某個(gè)表的操作不生成binlog日志的問(wèn)題解決

    文章介紹了四種方法讓MySQL中某個(gè)表的操作不生成binlog日志:會(huì)話級(jí)臨時(shí)關(guān)閉binlog、通過(guò)復(fù)制過(guò)濾規(guī)則、調(diào)整binlog格式和全局禁用binlog,每種方法都有其適用場(chǎng)景和局限性,建議優(yōu)先使用會(huì)話級(jí)臨時(shí)關(guān)閉方法,并根據(jù)具體需求選擇合適的方案,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • MySQL恢復(fù)誤刪數(shù)據(jù)圖文教程

    MySQL恢復(fù)誤刪數(shù)據(jù)圖文教程

    MySQL誤刪數(shù)據(jù)庫(kù)造成了數(shù)據(jù)的丟失,這是非常尷尬的,下面這篇文章主要給大家介紹了關(guān)于MySQL恢復(fù)誤刪數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • mysql不支持group by的解決方法小結(jié)

    mysql不支持group by的解決方法小結(jié)

    下載安裝的是最新版的mysql5.7.x版本,默認(rèn)是開(kāi)啟了 only_full_group_by 模式的,但開(kāi)啟這個(gè)模式后,原先的 group by 語(yǔ)句就報(bào)錯(cuò),然后又把它移除了
    2020-02-02
  • MYSQL函數(shù)的使用梳理

    MYSQL函數(shù)的使用梳理

    本篇文章講解是是MySQL的函數(shù)方法,涵蓋所有的MySQL常見(jiàn)的方法,MySQL函數(shù),是一種控制流程函數(shù),屬于數(shù)據(jù)庫(kù)用語(yǔ)言,以下列出了這些函數(shù)的說(shuō)明
    2022-05-05
  • MySql數(shù)據(jù)庫(kù)單表查詢與多表連接查詢效率對(duì)比

    MySql數(shù)據(jù)庫(kù)單表查詢與多表連接查詢效率對(duì)比

    在遇到數(shù)據(jù)之間的聯(lián)系很復(fù)雜,建表就很糾結(jié),到底該怎么去處理這些復(fù)雜的數(shù)據(jù)呢,是單表查詢,然后在業(yè)務(wù)層去處理數(shù)據(jù)間的關(guān)系,還是直接通過(guò)多表連接查詢來(lái)處理數(shù)據(jù)關(guān)系呢
    2021-09-09
  • MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程

    MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程

    這篇文章主要介紹了MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系講解教程,來(lái)自于美團(tuán)技術(shù)團(tuán)隊(duì)的經(jīng)驗(yàn)實(shí)際經(jīng)驗(yàn)分享,需要的朋友可以參考下
    2015-11-11
  • SQL IDENTITY_INSERT作用案例詳解

    SQL IDENTITY_INSERT作用案例詳解

    這篇文章主要介紹了SQL IDENTITY_INSERT作用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

南澳县| 武强县| 轮台县| 洛隆县| 巴彦县| 正阳县| 德清县| 博兴县| 睢宁县| 灯塔市| 准格尔旗| 江永县| 莱阳市| 景德镇市| 奎屯市| 鞍山市| 八宿县| 托克托县| 巴东县| 长岭县| 灵宝市| 黔东| 浦江县| 凤冈县| 邓州市| 连南| 股票| 巨野县| 赤壁市| 静宁县| 徐闻县| 澜沧| 秦安县| 玉溪市| 哈尔滨市| 肥东县| 申扎县| 拉萨市| 封丘县| 年辖:市辖区| 吉首市|