连载中 2/20

拆之前的三招:把单库性能先榨干

2026-07-19 · 1244 阅读 · 0 评论 · 0 赞

先问三个问题

上一篇那张两亿行的订单表,团队的第一反应是「上分库分表」,被我按住了。动刀之前先回答三个问题:索引建对了吗?冷数据归档了吗?读流量分出去了吗?三个问题对应三招顶格优化,成本低一个数量级,见效却常常立竿见影。很多「必须拆表」的项目,三招打完发现单库还能再战两年。

第一招:归档冷数据

互联网业务的数据有铁律:绝大多数查询只发生在最近的数据上。订单查询的九成以上落在近三个月,两年前的订单一年也翻不了几次。把这张两亿行表按时间拉个直方图,你会发现真正被频繁访问的只有两三千万行——剩下那一亿七八,全是压在索引里、拖慢每一层 B+ 树的死重。归档的刀法:建一张结构相同的归档表(或直接进归档库),写个分批任务把超过阈值的数据搬过去,主表瞬间瘦身。收益立竿见影:索引层级变矮、Buffer Pool 命中率上升、DDL 时长跟着行数一起缩。归档任务的三个纪律——限速(别把主库 IO 打满)、幂等(可重跑)、可回捞(偶尔要查旧订单,得有去处)——第 17 篇展开。

第二招:读写分离加缓存

单实例的瓶颈分读写两侧,而多数业务读远大于写。主从加路由的读写分离架构,能把读流量分给多个从库,写主库单独喘气;热点的读再往前顶一层缓存,Redis 扛走大头,DB 只接未命中的流量。这一招解决的是「实例的 QPS 瓶颈」——但它有个诚实的边界:写 QPS 分不出去。主库只有一台,写入能力就只有一台的上限。如果顶不住的是写、且单表行数同时告急,三招就只剩最后一根稻草。

第三招:索引与 SQL 治理

很多「表太大了」的体感,其实是「SQL 太烂了」的错觉。MySQL 系列里演练过的那套武器——慢查询日志、EXPLAIN、索引设计——在这里全部适用,而且大表上收益被行数放大:小表上全表扫描慢 50 毫秒,两亿行的表上就是 50 秒。治理的产出要沉淀成规矩:慢 SQL 台账、索引评审、深分页禁令。没有这套地基,拆完库该慢还是慢——分库分表会把烂 SQL 从「一张大表的慢」变成「三十二张小表的慢乘以归并」,只会更糟。

三招之后,才是动刀

三招的分工画一张图:归档治行数,读写分离加缓存治读 QPS,SQL 治理治慢的根源。三招打完还剩两类无解的病:写 QPS 超过单实例上限,以及热数据本身的行数规模(归档后主表还有几千万上亿且持续增长)——这才是分库分表的入场券。记住这个顺序:优化是手段,拆分也是手段,先便宜的、后昂贵的。

确认动刀之后,第一个问题是方向:刀往哪里落?垂直还是水平?下一篇从两种拆法的本质差异讲起。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#分库分表#归档#读写分离#索引治理#SQL优化

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10101 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9873 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9294 阅读 · 21 评论 · 287 赞