Yihui’s Blog

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

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

一句话答案

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

面试口语版

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

原理拆解

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

关键细节

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

面试官追问

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

高分补充

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

学习清单

  • 从查询、事务、ID、扩容、运维五类问题组织回答。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文