付同学的技术客栈/

海量数据存储:数据多了以后,系统会先在哪里变慢

所属专题 高并发海量数据系统架构 第 4 篇 / 共 11 篇 查看专题目录

活动系统最开始只有几万条订单,大家不会认真讨论“数据生命周期”。

后台想查就查,运营想导出就导出,日志临时塞数据库也没人觉得有问题。直到半年后,订单表越来越大,报表越来越慢,备份时间越来越长,连一次普通 DDL 都变得让人紧张。

海量数据的问题,往往不是突然爆炸,而是慢慢把系统磨钝。

它真正考验的不是“哪里能装下更多数据”,而是不同数据该不该继续待在同一个地方。

海量数据的问题,最开始通常不吓人。

第一年几十万行,查询很快;第二年几千万行,偶尔慢一点;到后面某个早上,运营要拉一份报表,页面转了半天,大家才突然意识到:这个表已经不是当年那个表了。

我见过一些系统,业务还没到真正爆发,数据先把维护成本撑起来了。备份变慢,迁移变慢,索引调整不敢随便动,连一个看起来普通的删除都要小心。

所以数据量不是一个数字问题,它会慢慢改变团队做每个操作时的心理负担。

现场判断 海量数据最麻烦的不是“装不下”,而是所有维护动作都开始变重。

查询、备份、归档、DDL、报表导出,每一件事都会被数据量放大。

一、单表变大后,很多操作都会变重

单表过大,最明显的是查询变慢。

但它影响的不只是查询。索引会变大,写入会受影响,更新和删除成本会上升,备份恢复时间变长,表结构变更也会更谨慎。

这时候不要只问“要不要分表”,先问几个更朴素的问题:

  • 这张表里的数据是不是都一样重要?
  • 最近订单和三年前订单访问频率一样吗?
  • 查询是不是总围绕时间、用户、商户、状态?
  • 报表查询是不是混在在线库里跑?

很多系统还没到必须分库分表的程度,先做冷热分离、归档和索引调整,就能解决大部分问题。

二、历史数据不能永远挤在在线库里

历史订单是很典型的数据。

它平时不怎么访问,但业务又要求查得到;它不常变,但一直占着在线表空间;它价值还在,但不该继续拖慢核心交易。

比较稳的做法是按业务规则归档。

比如最近 3 到 6 个月订单留在线库,历史订单迁移到历史表、归档库、对象存储或分析系统。

归档不是简单地复制和删除,它要考虑:

  • 分批执行,避免影响线上。
  • 可重试,失败后能继续。
  • 可校验,迁移前后数量和关键字段一致。
  • 可查询,用户需要历史记录时还能找到。

数据归档做得好,在线库会轻很多。

三、在线交易和报表分析不要互相折磨

在线业务库主要处理 OLTP,也就是高频、短事务、低延迟的增删改查。

报表分析更接近 OLAP,通常是大范围扫描、聚合、排序、统计。

把复杂报表直接压到在线库上,短期方便,长期危险。运营导出一个全年订单报表,可能把正常下单接口也拖慢。

更合理的方式是:

业务库
  -> 同步或异步抽取
  -> 数仓 / ClickHouse / Elasticsearch / 报表库
  -> 报表和分析查询

在线库负责业务正确性,分析系统负责查询效率。一个数据库不应该同时承担所有目标。

数据分层 不同价值、不同频率的数据,要慢慢从在线库里分出来
热数据 最近订单、核心交易、当前活动,优先保证低延迟和正确性。
温数据 近期历史、常用查询,可放历史表或独立查询库。
冷数据 低频访问、合规留存,适合归档库或对象存储。
分析数据 报表、聚合、检索,交给数仓、ClickHouse 或搜索系统。

在线库不是仓库。越早定义生命周期,后面越少在大表上硬扛。

四、时序数据、文件和日志要各归其位

有些数据天生就不适合放在普通业务表里。

设备采集数据、监控指标、接口耗时,更像时序数据。它们写入频率高、按时间查询多、历史价值逐渐下降,适合时序数据库或专门的分区策略。

图片、附件、导出文件,也不应该直接塞进数据库。数据库保存元数据和地址,文件本体放对象存储或文件服务,通常更合理。

日志也是类似。业务日志、访问日志、错误日志、链路日志,如果全部进业务库,很快就会污染核心数据。日志应该服务于排查,而不是拖累交易。

五、数据生命周期要提前设计

很多系统的问题不是没有存储,而是没有生命周期。

一条数据从产生开始,可能会经历热数据、温数据、冷数据、归档数据,最后到过期删除。每个阶段访问频率不同,存储成本也不同。

如果一开始完全不设计生命周期,数据只会越堆越多。等数据库撑不住时再处理,迁移成本会很高,也更容易影响线上。

我更喜欢在设计阶段就把规则讲清楚:

  • 最近多久的数据算热数据?
  • 哪些数据需要长期保留?
  • 哪些数据可以压缩或归档?
  • 哪些数据到期必须删除?
  • 历史查询的响应时间要求是多少?

这些问题不酷,但很现实。

六、可以带走的判断清单

  • 表大不等于马上分表,先看冷热和访问路径。
  • 历史数据要能查,但不一定要留在在线表。
  • 报表分析不要长期压在线库。
  • 时序数据、文件、日志要用适合它们的存储。
  • 数据生命周期要提前定义,不要等撑不住再补。

海量数据存储的关键不是“装得下”,而是“放得对”。


本系列:

高并发海量数据系统架构 第 4 篇 / 共 11 篇
查看专题目录

留下一条评论

暂无评论