MySQL基础-分库分表


分库分表

💡 一、为什么需要分库分表(动因)

核心目标:解决单库单表性能瓶颈。

  • 数据量大 → 单表数据超千万行,查询慢、索引失效

  • 并发高 → 单库连接数/事务冲突瓶颈

  • 运维难 → 备份、迁移、恢复时间长

  • 可用性差 → 单点故障风险高,难以扩展

✅ 示例句式:

随着业务发展,单表数据量过大或请求并发过高,数据库响应延迟明显,单库承压,因此需要通过分库分表来提升系统的吞吐能力与可用性。

🧩 二、分库分表的方式与策略

1. 拆分方式
  • 垂直拆分(按业务模块拆库):如用户、订单、商品拆成不同库

  • 水平拆分(按数据范围拆表):如 user_id % N 拆成 user_0, user_1…

2. 分片策略(Sharding Key)
  • 范围分片(如:按时间、ID区间)

  • 哈希分片(如:user_id % N)

  • 标签分片(如:地区、商户ID)

✅ 示例句式:

水平拆分时我们通常选取业务查询最频繁的字段作为分片键,比如 user_id,使用 hash 或 range 分片以保证数据均衡与高可用。


⚙️ 三、常见技术实现方式

1. 自研方案
  • 在 DAO 层封装路由逻辑,结合 ThreadLocal 或 AOP 实现数据源动态切换
  • 灵活但维护成本高,适合中小型项目
2. 中间件方案(主流)
  • ShardingSphere-JDBC:支持分库分表、读写分离、柔性事务

  • MyCat:基于代理的分布式数据库中间件

  • TDDL:阿里内部方案

  • Vitess、PolarDB-X、OceanBase:云原生一体化解决方案

✅ 示例句式:

我们团队使用 ShardingSphere-JDBC 实现分库分表,通过配置 sharding rule 动态路由数据源,配合读写分离有效降低主库压力。


🔄 四、分布式事务与一致性问题

  • 分片后事务可能涉及多个库,难以使用本地事务

  • 解决方案:

    • 强一致性:使用 XA 两阶段提交(开销大)

    • 最终一致性:TCC、SAGA、消息补偿机制

    • 避开事务:通过业务逻辑控制,将操作限制在单分片内

✅ 示例句式:

我们尽量通过业务分片控制事务边界落在同一个库上,如果无法避免跨库,则使用 TCC 模式实现柔性事务控制。


📈 五、扩容与维护

  • 扩容:如原先 4 分片扩到 8 分片 → 面临数据迁移、路由规则变更

  • 迁移策略:双写 + 验证 + 切换(或使用工具如 DataX、Canal)

  • 监控点:热点分布、分片倾斜、主从同步延迟、慢 SQL

✅ 示例句式:

在分片扩容时,我们采用“新旧双写+数据比对+流量切换”策略,确保数据一致性和用户无感知迁移。


🧠 六、项目实战加分项(如有)

如果你曾实际在项目中用过分库分表,建议:

  • 简要描述场景、数据量、采用的中间件和策略

  • 强调你解决的关键问题,如:分片键选择、事务方案、查询优化

✅ 示例句式:

在智慧教育平台项目中,因题库表数据超千万,查询频繁,我们使用 ShardingSphere 做水平分表,按 question_id 取模分为 8 表,并使用缓存+预查询优化了分页性能。


文章作者: foo1s
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 foo1s !
评论