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 replace into 语句浅析(二)

    MySQL replace into 语句浅析(二)

    这篇文章主要介绍了MySQL replace into 语句浅析(二),本文着重给出了几个特殊案例分析,需要的朋友可以参考下
    2015-05-05
  • Navicat for MySQL的使用教程详解

    Navicat for MySQL的使用教程详解

    本文给大家介绍Navicat for MySQL的使用教程,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习下吧
    2021-05-05
  • 解析Mysql临时表及特点

    解析Mysql临时表及特点

    本篇文章是对Mysql中的临时表以及特点进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL8.0新特性之不可见主键的使用

    MySQL8.0新特性之不可见主键的使用

    MySQL8.0.30版本引入不可见主键,它可以自动为没有显式指定主键的 InnoDB 表创建一个不可见的主键,本文主要介绍了MySQL8.0新特性之不可见主键的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • mysql 5.7 数据库安装步骤个人总结

    mysql 5.7 数据库安装步骤个人总结

    这篇文章主要介绍了mysql 数据库安装步骤个人总结,需要的朋友可以参考下
    2017-09-09
  • mysqlbinlog查看日志[ERROR]unknown variable ‘default-character-set=utf8’

    mysqlbinlog查看日志[ERROR]unknown variable ‘default-ch

    使用mysqlbinlog工具处理MySQL的二进制日志文件时,出现[ERROR]unknown variable ‘default-character-set=utf8’,本文将详细介绍出现ERROR的原因和如何解决这一问题
    2025-03-03
  • MySQL对数据库和表进行DDL命令的操作代码

    MySQL对数据库和表进行DDL命令的操作代码

    DDL(Data Definition Language),是数据定义语言的缩写,它是SQL(Structured Query Language)语言的一个子集,用于定义或修改数据库的结构,本文给大家介绍了MySQL对数据库和表进行DDL命令的操作,需要的朋友可以参考下
    2024-07-07
  • Win下Mysql5.6升级到5.7的方法

    Win下Mysql5.6升级到5.7的方法

    MySQL的升级方式分为两种:原地升级和逻辑升级。这两种升级方式,本质没有什么区别的,下面通过本文给大家详细介绍Win下Mysql5.6升级到5.7的方法,需要的的朋友参考下
    2017-04-04
  • MySQL的索引详细介绍(全网最新整理)

    MySQL的索引详细介绍(全网最新整理)

    这篇文章详细介绍了MySQL中索引的定义、数据结构、优缺点、使用场景以及如何创建和删除索引,还讲解了如何使用EXPLAIN关键字分析查询性能,并提供了索引失效的常见原因和优化建议,最后,文章提到慢查询日志的使用方法和作用,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • MySQL优化之如何写出高质量sql语句

    MySQL优化之如何写出高质量sql语句

    在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要因素。这篇文章主要给大家介绍了关于MySQL优化之如何写出高质量sql语句的相关资料,需要的朋友可以参考下
    2021-05-05

最新评论