Yihui’s Blog

对数据库进行分库分表可能会引发哪些问题?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #分库分表 #分布式系统 #VIP

一句话答案

分库分表把单机问题转化为分布式问题,会带来路由、跨分片查询、事务、唯一 ID、分页排序、扩容迁移、热点和运维一致性等复杂度。

面试口语版

拆分后最直接的问题是原来一次 SQL 能完成的 JOIN、聚合、排序和分页可能要在多个分片执行,再由应用合并,性能和正确性都更难保证。跨库事务不能再依赖单机 ACID,通常要通过业务拆分、消息最终一致、TCC 或 Saga 处理;自增 ID 也要换成全局唯一方案。另外分片键选择不当会造成热点或大量广播查询,扩容时还要迁移和重路由数据。运维层面则增加连接数、监控、备份恢复、DDL、故障定位和数据对账成本。

原理拆解

问题典型表现常用处理
跨分片查询JOIN、聚合、排序成本高冗余、宽表、ES、应用聚合
分布式事务局部成功、局部失败最终一致、事务消息、补偿
全局 ID自增冲突雪花、号段、全局序列
分页各分片都要取数再归并游标分页、限制深翻页
扩容哈希重映射与双份数据预分片、双写迁移、灰度
热点单租户或热点键压垮分片散列、热点拆分、限流

关键细节

  • “拆得越多越好”是错误的,分片数量会直接放大连接和运维成本。
  • 逻辑主键、唯一约束只能在单分片内天然保证;全局唯一需额外设计。
  • 数据倾斜既可能来自数量,也可能来自少量热点数据的访问频率。

面试官追问

  1. 分库分表后如何做跨库分页?
  2. 如何保证全局唯一约束?
  3. 分片键选错后如何补救?

高分补充

分库分表是“用系统复杂度换容量和吞吐”,只有收益超过长期研发、迁移和运维成本才值得实施。

学习清单

  • 从查询、事务、ID、扩容、运维五类问题组织回答。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts