MySQL使用ShardingSphere-JDBC实现数据分片

 更新时间:2026年03月03日 09:30:08   作者:Akk_it  
本文详细介绍了如何使用ShardingSphere-JDBC进行MySQL分库分表,包括垂直分库、水平分库和水平分表的实现方式,以及分片键的选择、绑定表和广播表的使用等,通过YAML配置,可以简单高效地实现分片,解决单库单表数据量过大问题,需要的朋友可以参考下

一、前言

当单库数据量达到千万级、单表达到百万级时,性能会急剧下降,分库分表是解决数据存储瓶颈的核心方案。本文基于 ShardingSphere-JDBC,详解垂直分库、水平分库、水平分表的实现方式。

二、分库分表基础:CAP 定理与解决方案

  1. CAP 定理:分布式系统无法同时满足一致性(C)、可用性(A)、分区容忍性(P),MySQL 分库分表通常选择:
    • AP:保证可用性,牺牲强一致性(最终一致);
    • CP:保证强一致性,牺牲可用性(适合金融场景);
  2. 主流解决方案
    • ShardingSphere-JDBC:轻量级,嵌入应用内,无中间件依赖;
    • ShardingSphere-Proxy:独立中间件,支持多语言;
    • MyCat:老牌数据库中间件。

三、ShardingSphere-JDBC 核心概念

  1. 分片键:用于分库 / 分表的字段(如 user_id、id);
  2. 分片算法:INLINE(行内表达式)、MOD(取模)、HASH(哈希)等;
  3. 绑定表:关联表(如 t_order 和 t_order_item),避免笛卡尔乘积,提升查询效率;
  4. 广播表:字典表(如 t_dict),同步到所有分片节点,保证数据一致。

四、分库分表实战(YAML 配置)

1. 垂直分库(按业务拆分)

将不同业务表拆分到不同数据库(如用户表→user_ds,订单表→order_ds):

rules:
  - !SHARDING
    tables:
      t_user:
        actualDataNodes: user_ds.t_user  # 用户表在user_ds库
      t_order:
        actualDataNodes: order_ds.t_order # 订单表在order_ds库

2. 水平分库(按分片键拆分到多个库)

将订单表按 user_id 取模拆分到 order_ds_0 和 order_ds_1 两个库:

rules:
  - !SHARDING
    tables:
      t_user:
        actualDataNodes: user_ds.t_user
      t_order:
        actualDataNodes: order_ds_${0..1}.t_order0 # 订单表在2个库的t_order0表
        databaseStrategy:
          standard:
            shardingColumn: user_id # 分片键:user_id
            shardingAlgorithmName: userid_inline # 分片算法
    shardingAlgorithms:
      userid_inline:
        type: INLINE
        props:
          algorithm-expression: order_ds_${user_id % 2} # 取模拆分

3. 水平分表(按分片键拆分到多个表)

将订单表按 id 取模拆分到每个库的 t_order0 和 t_order1 表:

rules:
  - !SHARDING
    tables:
      t_user:
        actualDataNodes: user_ds.t_user
      t_order:
        actualDataNodes: order_ds_${0..1}.t_order${0..1} # 2库×2表=4个物理表
        databaseStrategy:
          standard:
            shardingColumn: user_id
            shardingAlgorithmName: userid_inline
        tableStrategy:
          standard:
            shardingColumn: id # 分表键:id
            shardingAlgorithmName: orderid_inline
    shardingAlgorithms:
      userid_inline:
        type: INLINE
        props:
          algorithm-expression: order_ds_${user_id % 2}
      orderid_inline:
        type: INLINE
        props:
          algorithm-expression: t_order${id % 2} # 取模分表

4. 关联表(绑定表)+ 广播表

rules:
  - !SHARDING
    tables:
      t_user:
        actualDataNodes: user_ds.t_user
      t_order:
        actualDataNodes: order_ds_${0..1}.t_order${0..1}
        databaseStrategy:
          standard:
            shardingColumn: user_id
            shardingAlgorithmName: userid_inline
        tableStrategy:
          standard:
            shardingColumn: id
            shardingAlgorithmName: orderid_inline
      t_order_item: # 订单项表(关联表)
        actualDataNodes: order_ds_${0..1}.t_order_item${0..1}
        databaseStrategy:
          standard:
            shardingColumn: user_id
            shardingAlgorithmName: userid_inline
        tableStrategy:
          standard:
            shardingColumn: order_id
            shardingAlgorithmName: orderid_item_inline
    bindingTables: # 绑定表:t_order和t_order_item
      - t_order,t_order_item
    shardingAlgorithms:
      userid_inline:
        type: INLINE
        props:
          algorithm-expression: order_ds_${user_id % 2}
      orderid_inline:
        type: INLINE
        props:
          algorithm-expression: t_order${id % 2}
      orderid_item_inline:
        type: INLINE
        props:
          algorithm-expression: t_order_item${order_id % 2}
  - !BROADCAST # 广播表:t_dict(字典表)
    tables:
      - t_dict

五、分库分表注意事项

  1. 分片键选择:优先选查询高频字段(如 user_id),避免跨分片查询;
  2. 避免跨库事务:尽量将同一事务的操作落在同一分片;
  3. 主键生成:使用雪花算法生成分布式 ID(64 位,19 位整数),避免主键冲突;
  4. 查询优化
    • 避免 SELECT *,使用覆盖索引;
    • 关联查询使用绑定表,减少笛卡尔乘积。

总结

  1. 垂直分库按业务拆分,水平分库 / 分表按分片键拆分,解决单库 / 单表数据量过大问题;
  2. ShardingSphere-JDBC 通过 YAML 配置实现分片,INLINE 算法简单高效,适合大部分场景;
  3. 绑定表减少关联查询开销,广播表保证字典数据一致,分片键选择是分库分表的核心。

以上就是MySQL使用ShardingSphere-JDBC实现数据分片的详细内容,更多关于MySQL ShardingSphere-JDBC数据分片的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL慢查询日志中的Lock_time由来解析

    MySQL慢查询日志中的Lock_time由来解析

    这篇文章主要为大家介绍了慢查询日志中Lock_time的由来解析,以及Lock_time 包含哪些锁等待时间、以及是怎么计算得到的,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-06-06
  • 关于MySQL中Update使用方法举例

    关于MySQL中Update使用方法举例

    这篇文章主要给大家介绍了关于MySQL中Update使用方法的相关资料,更新数据是使用数据库时最重要的任务之一,在本教程中您将学习如何使用MySQL UPDATE语句来更新表中的数据,需要的朋友可以参考下
    2023-11-11
  • MySQL之my.cnf配置文件图文详解

    MySQL之my.cnf配置文件图文详解

    my.cnf是mysql启动时加载的配置文件,一般会放在mysql的安装目录中,用户也可以放在其他目录加载,下面这篇文章主要给大家介绍了关于MySQL之my.cnf配置文件的相关资料,需要的朋友可以参考下
    2022-09-09
  • MySQL 数据库 binLog 日志的使用操作

    MySQL 数据库 binLog 日志的使用操作

    binlog是MySQL数据库中的一种日志类型,它记录了数据库中的所有更改操作,例如插入、更新、删除操作,本文给大家介绍MySQL 数据库 binLog 日志的使用,感兴趣的朋友一起看看吧
    2023-08-08
  • mysql in索引慢查询优化实现步骤解析

    mysql in索引慢查询优化实现步骤解析

    这篇文章主要为大家介绍了mysql in慢查询优化实现步骤的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • MySQL中通过EXPLAIN如何分析SQL的执行计划详解

    MySQL中通过EXPLAIN如何分析SQL的执行计划详解

    这篇文章主要给大家介绍了关于MySQL中通过EXPLAIN如何分析SQL的执行计划的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的安康学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Mysql的row_number函数使用介绍

    Mysql的row_number函数使用介绍

    这篇文章主要为大家介绍了Mysql的row_number函数使用原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 选择MySQL数据库进行连接的简单示例

    选择MySQL数据库进行连接的简单示例

    这篇文章主要介绍了选择MySQL数据库进行连接的简单示例,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Mysql调优Explain工具详解及实战演练(推荐)

    Mysql调优Explain工具详解及实战演练(推荐)

    这篇文章主要介绍了Mysql调优Explain工具详解及实战演练,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • MAC下MYSQL数据库密码忘记的解决办法

    MAC下MYSQL数据库密码忘记的解决办法

    这篇文章主要介绍了Mac操作系统下MYSQL数据库密码忘记的快速解决办法,教大家重置MYSQ密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论