3、分库分表中间件:ShardingSphere-JDBC 核心概念、ShardingSphere-Proxy 架构、MyCat 与 ShardingSphere 对比、主流中间件选型建议

好,咱们进入第三个章节。说实话,分库分表这个事儿,光有理论不行,你得有趁手的工具。今天我就把市面上最主流的几个中间件掰开揉碎了讲给你听。

3.1 ShardingSphere-JDBC 核心概念

先说说 ShardingSphere-JDBC。我个人习惯把它理解成一个「增强版的 JDBC 驱动」。它不部署独立服务,而是直接嵌入到你的应用里。

核心概念其实就三个:数据源分片规则执行引擎

  • 数据源:就是你要连接的多个数据库实例。比如你有 4 个库,每个库 4 张表,那就配置 4 个数据源。
  • 分片规则:这是灵魂。你要告诉它「按什么字段分」、「分到哪个库」、「分到哪张表」。我见过不少新手把规则写反了,结果数据全跑到了一个库里。
  • 执行引擎:它负责把 SQL 解析、改写、路由、归并。说白了,你写一条 SQL,它帮你拆成多条,分别去不同库表执行,最后把结果拼回来。

举个例子:假设订单表按 user_id 取模分库,按 order_id 取模分表。你查某个用户的订单,ShardingSphere-JDBC 会自动算出该去哪个库、哪张表查,你完全不用操心。

💡 我在项目中遇到过一个问题:分片键没选好,导致跨库查询特别多。后来我强制要求所有业务查询必须带上分片键,性能直接翻倍。

3.2 ShardingSphere-Proxy 架构

ShardingSphere-Proxy 跟 JDBC 版本不一样。它是个独立的服务进程,部署在应用和数据库之间。你想想看,它就像一个透明的代理层。

它的架构是这样的:

  • 协议层:兼容 MySQL、PostgreSQL 协议。你的应用连它就像连一个普通数据库。
  • 核心层:负责 SQL 解析、路由、改写、执行、归并。跟 JDBC 版本用的是同一套内核。
  • 存储层:连接后端的真实数据库集群。

为什么要用 Proxy 模式?我总结了两点:

  1. 对应用无侵入:你不需要改代码,只需要改数据库连接地址。
  2. 适合异构系统:比如你的团队有 Java、Go、Python 多个语言,用 Proxy 统一接入最省事。

⚠️ 注意:Proxy 模式会多一层网络开销。我曾经压测过,性能损耗大约在 5%-10% 之间。如果你的业务对延迟极其敏感,建议优先考虑 JDBC 模式。

3.3 MyCat 与 ShardingSphere 对比

很多老项目还在用 MyCat。说实话,MyCat 当年确实解决了分库分表的问题,但现在已经有些跟不上时代了。

我直接给你列个对比表,一目了然:

对比维度 MyCat ShardingSphere
架构模式 仅 Proxy 模式 JDBC + Proxy 双模式
SQL 支持 有限,复杂 SQL 容易报错 支持大部分 SQL,包括子查询、JOIN
分布式事务 弱支持 支持 XA、Seata、柔性事务
社区活跃度 较低,更新缓慢 Apache 顶级项目,迭代快
配置方式 XML 配置,较繁琐 YAML/Spring Boot 配置,更灵活
性能 Proxy 模式,有网络开销 JDBC 模式无额外开销,Proxy 模式略优

我的建议:如果你还在用 MyCat,并且项目不复杂,可以继续用。但如果是新项目,我强烈建议直接上 ShardingSphere。为什么?因为 MyCat 的 SQL 解析能力太弱了,我曾经被它坑过一次——一条带子查询的 SQL,在 MyCat 里跑直接报错,换成 ShardingSphere 就没事。

3.4 主流中间件选型建议

好,到了大家最关心的环节:到底选哪个?

我根据不同的场景,给你几个选型建议:

  • 场景一:Java 单体应用,对性能要求极高
    → 选 ShardingSphere-JDBC。嵌入应用,零网络开销,性能最好。
  • 场景二:多语言团队,不想改代码
    → 选 ShardingSphere-Proxy。统一接入,对应用透明。
  • 场景三:老项目迁移,已经在用 MyCat
    → 如果业务简单,可以继续用 MyCat。但建议逐步迁移到 ShardingSphere。
  • 场景四:需要分布式事务支持
    → 选 ShardingSphere。它内置了 XA 和 Seata 支持,MyCat 在这方面比较弱。
  • 场景五:数据量不大,只是简单分表
    → 其实可以考虑直接用数据库自带的方案,比如 MySQL 的分区表。别一上来就上中间件,过度设计也是坑。

💡 我个人习惯:新项目一律用 ShardingSphere-JDBC。除非团队里有非 Java 成员,才会考虑 Proxy 模式。记住一个原则——能少一层就少一层,性能是第一位的。

嗯,这一章的内容就到这里。说白了,选中间件没有银弹,关键看你的业务场景。下一章我会带你手把手配置 ShardingSphere-JDBC,到时候咱们实战见。