← 每日面试题 学习看板

一个几百万的数据你怎么设计这块的结构

面试题/真实面试/2021/一个几百万的数据你怎么设计这块的结构.md

一个几百万的数据你怎么设计这块的结构

首次来源:明略科技 2021 二面

原题

一个几百万的数据你怎么设计这块的结构?

完整讲解(权威版)

最后更新:2026-10-30 · 基于第 1 次作答

L1 · 30 秒速记

结论:几百万数据先澄清上下文(总量 vs 日增量),再按"单表容量 + 查询模式"选分区/分表/归档。 关键词:表分区 · 分库分表 · 归档 · 分区裁剪 · 冷备 边界:几百万不一定要分库分表,先评估单表能否承载 + 查询是否走分区键。

L2 · 核心讲解

核心考点定位:面试官想听"为什么分、怎么分、查询怎么走",关键是先澄清"几百万是总量还是日增",再谈单表容量与索引,最后才是分区/归档的取舍;数据增长模式是判断的起点。

机制链(≥3 环):

  1. 澄清 → 几百万是总量(一次存量)还是每天增量(持续增长)?这决定用分区还是归档:静态存量无需拆分,持续增量才需要分区 + 归档。
  2. 单表容量 → 几百万行对 MySQL 单表通常可行(千万内),关键在索引与查询模式,不是行数。
  3. 分区 → 按时间/哈希分区,查询必须带分区键走分区裁剪,避免全分区扫描。
  4. 归档/冷备 → 冷数据定期迁移到归档表/ES/数仓,热表只保留近期数据。
  5. 索引兜底 → 分区键外的查询条件建联合索引,避免无分区键时全扫;冷备用逻辑备份防物理文件损坏。
  6. 选型依据 → 先看增长模式:静态存量走"单表 + 索引",持续增量走"分区 + 归档",两者结合才完整。

证据锚点:

对比与权衡:

方案适用优点代价
普通单表百万级、索引好简单数据持续增长会退化
表分区时间维度流水分区裁剪、运维按分区查询须带分区键
分库分表亿级、写瓶颈横向扩展分布式事务/跨片查询
归档冷热分离热表瘦身需迁移任务

常见误区:

  1. 错误:几百万就分库分表 → 正确:先评估单表(千万内通常可行)→ 为什么:分库分表复杂度高,用不上。
  2. 错误:分区后查询不带分区键 → 正确:必须走分区裁剪 → 为什么:否则退化为全表扫。
  3. 错误:冷备只备份表空间文件 → 正确:逻辑备份或转 ES/数仓 → 为什么:物理文件单独存易损坏(亲身踩坑)。
  4. 错误:单表行数 = 性能 → 正确:关键在索引与查询模式 → 为什么:索引好千万行也快。
  5. 错误:几百万静态数据也分区分表 → 正确:静态存量单表 + 索引即可 → 为什么:无增长无需拆分。
  6. 错误:分区后所有查询都自动裁剪 → 正确:只有 WHERE 含分区键才裁剪 → 为什么:不带分区键会扫所有分区。
  7. 错误:归档后冷数据就丢了 → 正确:归档库/ES 仍可查询,只是从热表移除 → 为什么:冷热分离不是删除数据。

适用边界:几百万静态数据 + 索引合理,单表足够;每天新增几百万的流水才需要按天分区 + 归档;分区必须带分区键查询,否则裁剪失效退化为全扫;若数据增长不可控或写成为瓶颈,才升级分库分表或引入分布式存储。

延伸追问(≥3)

  1. 表分区和分库分表怎么选?
  1. 分区键怎么选?
  1. 冷数据归档怎么做?
  1. 表空间文件备份为什么不可靠?

面试者参考回答(400–700 字)

【结论】 面试官您好,几百万数据的设计第一步是澄清上下文——"几百万是总量还是每天新增",这决定了用分区还是归档。

【三点】 第一,如果是一次性的几百万存量数据(比如几百万用户、商品),单表完全能扛——MySQL 单表千万行内只要索引和查询模式合理都没问题,关键是建好覆盖查询的联合索引,避免全表扫,不需要分库分表,分库分表是亿级、写瓶颈才上的方案,复杂度高,几百万用它是杀鸡用牛刀。第二,如果是每天新增几百万的流水(比如我们接口一天两三百万次调用产生的日志),就要按天表分区——每天一个分区,一个分区两三百万行,查询带时间条件就走分区裁剪只扫当天分区,性能可控;运维上还能按分区做清理和备份。第三,冷数据要定期归档——热表只保留近期数据,冷数据迁移到归档表或 ES/数仓,查询旧数据走归档库。这里我踩过一个坑:当时冷备只把表空间文件(ibd)上传对象存储,结果文件损坏无法恢复——物理文件单独备份不可靠,应该做整库逻辑备份,或者把冷数据转到 ES/数仓这类专门的冷备系统。

【边界】 当然,几百万不是分区的唯一理由——如果数据量不大但查询特别复杂(大范围扫、多条件聚合),索引和查询改写比分区更关键;分区要求查询一定带分区键,否则会退化成扫全部分区。所以核心是先看数据增长模式(存量 vs 增量),再决定"单表 + 索引"还是"分区 + 归档",别一上来就上分布式。

面试记录 2026-10-30(第 1 次)

题目:一个几百万的数据你怎么设计这块的结构

难度:high

标签:real-interview, db/mysql/index, company/明略科技

评分:⭐⭐⭐☆☆(3/5)

我的回答

这个问题缺少上下文;几百万的数据要设计什么呢?一天增加几百万的数据还是一共几百万的数据?之前接口一天大概有两三百万次的调用,生成的日志量级每天也是这个量级,当时为了存储,读取数据,统计的便利性,我们用表分区,每天一个表分区,相当于一个表就两三百万数据,使用的效果还算好,进行后续冷备份的时候,直接也可以备份表空间,不过这在恢复的时候出现问题了,表空间文件上传到对象存储中可能出现损坏了,导致无法正常使用,这款其实不应该这么备份的;应该是转到冷备份比如 es 之类的去存储,不过当时没有数据仓库没办法做这方面的事情;

点评

优点:先澄清上下文(总量 vs 日增,好习惯);真实场景——每天两三百万调用量级、按天表分区、冷备表空间损坏教训;区分了存量与增量。

不足:设计层面薄——漏分区分键选择与查询裁剪、索引设计、为什么分区而非分表、归档策略细节;冷备教训有了但没给替代方案深度。

补充:几百万先评估单表(索引合理千万内可行),日增流水才按天分区;冷备应整库逻辑备份或转 ES/数仓。

完整讲解见上方「完整讲解(权威版)」