{T}

如何做到MySQL高扩展性

0. 引言

业务增长到单机极限后,扩展性成为架构主旋律。**垂直扩展(Scale-Up)**升级硬件,有物理天花板;**水平扩展(Scale-Out)**加机器分摊,理论上无限。本文给出从"单机调优"到"分库分表"再到"分布式数据库"的完整扩展路径,以及万亿级数据量的应对方法论。

1. 高并发与扩展的基本方法

图表渲染中…
维度Scale-Up(垂直)Scale-Out(水平)
手段加 CPU/内存、换 NVMe、参数调优加机器:主从、分片、集群
天花板单机物理上限理论无上限(受元数据/协调限制)
成本高性能硬件昂贵且非线性普通机器线性扩展
复杂度高(分片键设计、跨片查询、一致性)
适用中等规模、短期扩容长期规划、海量数据

2. 垂直扩展(Scale-Up)

  1. 硬件:CPU 主频/核数、内存(Buffer Pool 命中率)、NVMe SSD(详见《如何突破单库性能瓶颈》);
  2. 参数:redo 容量、刷盘策略、连接数、临时表内存化;
  3. 架构优化:去掉无索引查询、热点行拆分(行锁竞争)、大字段拆表;
  4. 分区表PARTITION BY RANGE 按时间分区,配合分区裁剪(WHERE created_at 只扫分区)。注意:8.0 分区要求唯一键必须包含分区键,且分区不能解决单机瓶颈(只是物理文件拆分)——大表优先考虑分表而非分区

3. 水平扩展(Scale-Out)

3.1 第一层:主从复制 + 读写分离

读扩展(见《如何突破单库性能瓶颈》):一主多从,读 QPS 线性增长。写仍是单点

3.2 第二层:数据分片(Sharding)

分库分表是写扩展的核心手段(详见《为什么需要分库分表,如何实现》):

  • 分片键选择:业务访问最频繁的维度(用户 ID、订单 ID);
  • 分片算法:哈希取模、范围、一致性哈希;
  • 分片数量预估:按 3-5 年数据增长规划,尽量一次到位(扩容代价高,见《分库分表以后,如何实现扩容》);
  • 代价清单:跨片 JOIN 不可用(冗余/宽表/应用层聚合)、分布式事务(尽力而为/Seata)、全局唯一 ID(雪花)、跨片分页(合并排序)。

3.3 第三层:数据库中间件

中间件定位特点
ShardingSphere(Apache 顶级项目)分库分表 + 读写分离 + 数据加密JDBC 直连(性能好)/Proxy 代理(语言无关)双形态;8.0 兼容性好,社区活跃
MyCat代理式分片中间件国内老牌,配置管理简单;性能损耗在代理层
Vitess云原生分片(YouTube 出品)K8s 生态、大规模案例
ProxySQL读写分离/连接池专注流量治理,不承担分片

选型建议:Java 团队新项目 → ShardingSphere-JDBC(集成简单、性能好);异构语言/统一管控 → ShardingSphere-Proxy 或 MyCat;上云 → 云原生数据库(PolarDB/TDSQL 等自带扩展)。

3.4 第四层:集群化

  • MGR/InnoDB Cluster:高可用 + 有限扩展(读写分离场景);
  • 云 RDS 集群:云厂商托管的读写分离 + 只读实例扩展,运维成本最低。

4. 分布式数据库(NewSQL)

当分库分表的管理成本(分片键约束、跨片事务、扩容)超过收益时,考虑原生分布式数据库:

数据库类型特点
TiDB分布式 HTAP(NewSQL)MySQL 协议兼容(业务可无痛迁移)、TiKV 存储 + Raft 共识 + 自动分片(Region 自动分裂合并)、水平扩展透明、强一致
OceanBase分布式关系库蚂蚁集团出品,金融级,MySQL/Oracle 兼容
PolarDB-X云原生分布式阿里云,MySQL 生态
ClickHouseOLAP 分析列式存储,不适合 OLTP

TiDB 适合:数据量 10TB+、需要透明扩展与强一致、希望保留 MySQL 开发习惯的场景;不适合:超高频短事务(单行延迟略高于 MySQL)、复杂跨表事务依赖分布式事务性能的场景。

5. 万亿级数据量应对技巧

  1. 冷热分层:热数据(近 30 天)在 MySQL/TiDB,冷数据归档到对象存储/OLAP(数据生命周期管理);
  2. 时间维度分片:日志/流水类数据按天/月分表,配合定期归档(DROP 过期分区秒级);
  3. 预聚合:明细入库 + 实时聚合(Flink)+ 结果表,报表查询不碰明细;
  4. 缓存兜底:热点读走 Redis,数据库只承担"缓存未命中"流量;
  5. 只读副本:分析查询跑只读副本,不干扰在线事务;
  6. 数据压缩:8.0 透明页压缩(COMPRESSION=ZLIB)或列式归档表。

6. 重点总结

  • 扩展三阶段:Scale-Up(单机)→ Scale-Out(主从/分片)→ Distributed(NewSQL),每步都有明确触发条件;
  • 分库分表是"最后的武器":分片键设计决定命运,跨片复杂度需提前消化;
  • 中间件选型:ShardingSphere 是 Java 生态事实标准,Proxy 形态适合异构团队;
  • 数据量真到"万亿级"时,用分布式数据库 + 冷热分层 + 预聚合组合拳,别硬撑单机。

下一章讲解海量数据 MySQL 项目实战:从架构设计到容量规划的全流程案例。