首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据库扛不住了怎么办?读写分离、垂直拆分、水平分片三种方案对比

数据库扛不住了怎么办?读写分离、垂直拆分、水平分片三种方案对比

原创
作者头像
上海魁鲸科技
发布2026-09-03 18:31:35
发布2026-09-03 18:31:35
30
举报
文章被收录于专栏:解决方案解决方案

系统上线头一年,数据库从来不是问题。等业务跑起来、数据量涨上来,问题就来了:报表查询从两秒变成两分钟,订单表过了千万行后写入开始变慢,大促高峰期数据库 CPU 直接拉满,全站跟着卡死。

数据库扛不住,升级硬件(加内存换 SSD)能撑一阵,但治标不治本。真正结构性的解法有三种:读写分离、垂直拆分、水平分片。这三种方案解决的是不同的瓶颈,而且通常要按顺序走,跳级容易翻车。

方案一:读写分离

原理: 一主多从。所有写操作走主库,数据实时同步到多个从库,查询请求分摊到从库上。大多数系统的真实负载是"读多写少"——看一眼订单列表的请求远多于创建订单,把读请求分走,主库压力立刻下来。

优点:

  • 对业务代码侵入小,用中间件或云数据库自带功能即可实现
  • 见效快,从库加机器就能线性扩展读能力
  • 顺带提升了可用性,主库挂了从库可以顶上

缺点:

  • 解决不了写入瓶颈,写压力还是集中在主库
  • 主从同步有延迟(通常毫秒到秒级),写完立刻读的场景可能读到旧数据
  • 单表数据量过大的问题依然存在,该慢还是慢

适用场景: 读多写少、读请求成为主要压力的系统。这是数据库扩容的第一站,成本最低,收益最直接。

方案二:垂直拆分

原理: 按业务边界拆。原来一个库里几十张表,订单相关的一组表拆成订单库,库存相关的拆成库存库,用户相关的拆成用户库。每个库独立部署,各管各的业务,互不争抢资源。

优点:

  • 业务边界清晰,和微服务拆分天然配套,哪个业务压力大就单独扩容哪个库
  • 单个库的连接数、磁盘、内存压力都下降了
  • 故障隔离,订单库出问题不影响用户登录

缺点:

  • 跨库 JOIN 没了,原本一条 SQL 的事现在要调用两次再拼装
  • 跨库事务变成了分布式事务问题,复杂度上了一个台阶
  • 解决不了"单一业务本身太大"的问题:订单表一个亿,拆出去还是一张一个亿的表

适用场景: 业务模块多、耦合低、各模块数据量都还在千万级以内的系统。通常配合微服务改造一起做。

方案三:水平分片(分库分表)

原理: 单张表太大就拆成多张。一张 1 亿行的订单表,按用户 ID 取模拆成 16 张表分散到多个库,每张表只剩六百多万行。写入和查询时由中间件(如 ShardingSphere)根据分片键路由到对应的表。

优点:

  • 真正解决了单表数据量上限问题,容量可水平扩展
  • 读写压力都分散了,是三个方案里唯一能同时解决读、写、容量三重瓶颈的

缺点:

  • 复杂度最高:分片键一旦选定很难改,跨分片查询、分页排序、全局唯一 ID、分布式事务,每个都是坑
  • 扩容(比如 16 张表变 32 张)涉及数据迁移,操作窗口和方案要提前设计
  • 对开发和 DBA 团队要求高,不是买个中间件装上就完事

适用场景: 单表数据量过了两三千万还在快速增长的核心表(订单、流水、日志类),且读写分离和垂直拆分已经扛不住的时候。

按阶段对号入座

当前瓶颈

推荐方案

读请求太多,主库被查询拖垮

读写分离

业务模块多,库越来越臃肿

垂直拆分

单表几千万行起步,写入查询都慢

水平分片

正确姿势是循序渐进:先读写分离,再垂直拆分,最后对真正的大表做水平分片。三个手段经常共存于同一个系统。

落地前必做的三件事

第一件:先优化再上架构。 很多"数据库扛不住"其实是慢 SQL、缺索引、大事务的问题。先做一轮 SQL 审计和索引优化,能解决掉一半的性能问题,成本几乎为零。

第二件:分片键的选择要想三年。 按什么拆决定了未来所有查询的形态。按用户拆,按时间查就难受;按时间拆,热点全在最新分片上。选之前把未来三年的查询场景列一遍。

第三件:数据迁移方案先行。 分库分表最难的不是拆,是存量数据怎么搬。双写过渡、停机迁移、增量同步,方案要在拆分开始前就演练过。

写在最后

数据库扩容没有一步到位的好事。读写分离、垂直拆分、水平分片是一个阶梯,每一级都显著增加系统复杂度。能在低一级解决的问题,别急着上高一级——架构的复杂度本身就是一种成本。

上海魁鲸科技在企业系统架构设计与性能优化方面经验丰富,能够评估企业数据库的真实瓶颈,给出匹配业务规模的扩容方案,并稳妥完成数据迁移与架构演进。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 方案一:读写分离
  • 方案二:垂直拆分
  • 方案三:水平分片(分库分表)
  • 按阶段对号入座
  • 落地前必做的三件事
  • 写在最后
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档