台账类管理系统最常见的现象是:登录正常、首页正常,一点开台账列表就要等好几秒,翻到后面的页越翻越慢,导出或统计更久。多数情况下这不是服务器配置不够,而是查询方式、数据量和数据保留策略三个因素叠加的结果。
下面按“现象 → 可能原因 → 逐项排查顺序 → 预防措施”展开,可以先按顺序量一遍,再决定是优化 SQL、改分页策略,还是动手做归档与冷热分离。需要整体性的实施配合时,可以参考我们的软件定制开发与系统集成服务。
现象拆解:卡的是列表、是翻页,还是打开就慢
先把“卡”拆成可测量的几段,否则容易在错误的方向上改代码。建议在浏览器开发者工具和服务端日志两侧同时记录耗时:接口总耗时、数据库查询耗时、返回数据体积。
- 首屏慢:打开列表页即超时,通常指向无条件全表扫描、缺索引或统计总数过重。
- 翻页越翻越慢:前几页尚可、后几页明显劣化,多为大偏移量分页。
- 筛选后才慢:自由组合条件命中不了索引,或多表关联在高数据量下被放大。
- 导出/统计慢:与列表不是同一类问题,往往走的是全量扫描与聚合。
- 并发一高就慢:连接池、缓存与数据库并发能力的问题,单请求压测看不出来。
这一步的目标是拿到基准数字,后面任何优化的效果都靠它来判断,避免凭感觉反复改。
历史数据分页:大偏移量分页为什么越翻越慢
很多台账列表用的是页码式分页,底层写法是偏移加条数。数据库需要先跳过前面若干行再取数据,偏移越大扫描越多,后几页自然变慢。另外,查询总记录数如果每次都做一次大范围统计,也会把首屏拖住。
常见做法是改为“上一页/下一页”式的游标分页,用上一页最后一条的排序键作为起查条件;页码跳转可保留,但对深页设限或改为游标定位。总数可以缓存、可以估算,也可以在筛选条件变化时才重算。
- 看慢日志,确认列表接口的实际执行时间与扫描行数。
- 记录不同页深(例如第 1 页与末几页)的耗时差异,判断是否为偏移问题。
- 检查排序字段是否有可用索引,排序字段与查询条件是否能组合成覆盖索引。
- 确认总数统计是否每次请求都执行,是否可由缓存或估算替代。
- 确认前端是否一次请求了过大的页容量,或把整表数据拉回本地再分页。
取舍建议:游标分页牺牲了“跳转到任意页”的体验,对操作习惯要求高的评审或审计场景,可保留页码但限制最大页深,并提示改用条件筛选缩小范围。
归档策略:数据要不要搬走,先看访问分布
归档解决的是数据体积问题,前提是先弄清访问分布:业务用得最多的是近段时间的台账,历史数据主要是查证与审计。归档的目标不是“删”,而是把低访问频率的数据搬到更便宜的存储,并保留可查入口。
- 按时间归档:以会计年度、合同周期或业务自然切分点为界,规则清晰、易解释,适合大多数台账。
- 按状态归档:已办结、已关闭的数据可以与在办数据分离,减少主表体量。
- 按租户或组织归档:多见于多组织系统的隔离场景,但查询入口需要一并处理。
- 原表分区:不改业务表结构,由数据库层面分离冷热区,但要评估数据库支持程度与维护成本。
归档前必须确认三件事:归档数据的查询入口保留(历史查询页面或查询库);关联表的引用不会断裂;数据一致性有对账手段。我们在同类项目案例中就遇到过台账历史查询与在办列表混在一张表里、导致列表页持续劣化的情况,拆开后才稳定下来。
冷热分离的取舍:应用层拆分还是数据库层处理
冷热分离的常见实现有两条路:一是应用层拆分,热数据留主库,历史数据进归档库或历史表,由接口按查询条件路由;二是数据库层处理,用分区或只读副本隔离冷数据。
应用层拆分灵活、可控,能按业务定义冷热边界,但需要在代码里维护路由逻辑,写入时要判断归档触发点,测试面更大。数据库层改动小,但跨区查询与统计的代价需要提前评估,后期调整边界往往更麻烦。
建议的取舍依据是:数据访问规律是否明确、是否允许多一次查询跳转,以及团队是否有精力维护路由逻辑。数据尚在增长前期且查询规律不清时,优先做索引与分页优化,把归档作为第二步,避免过早拆分带来双份维护成本。
推荐的排查顺序
不要一上来就改代码。按下面顺序走,每一步确认收益后再进下一步,能避免反复返工。
- 量基准:用慢日志、执行计划和接口耗时定位最慢的那几条查询。
- 看查询:确认列表是否无条件全表扫描,过滤条件能否命中索引。
- 看分页:确认偏移量大小与总数统计的频率,判断是否先改为游标分页。
- 看数据体积:统计主表行数与年增长趋势,判断是否需要归档。
- 定边界:与业务确认冷热分界点和历史数据的查询入口。
- 选方案:应用层拆分或数据库层分区,比较维护成本后落地。
- 小范围试点:先对一类台账或一个时间段做归档,验证查询与对账正常再推广。
- 补监控:为列表接口、归档任务、跨库查询各设监控项,防止问题悄悄回潮。
预防措施
台账类系统的性能退化通常是渐进的。设计阶段就定好分页方式与数据保留策略,比事后重构便宜得多。新系统建议默认支持游标分页与条件筛选,并在需求阶段就与业务约定归档周期。
运维上,把列表接口耗时与归档任务执行结果纳入日常监控,定期检查慢日志中反复出现的查询。如果系统还要与 OA 或 ERP 对接,台账数据的写入量和同步频率同样会影响列表性能,这部分需要提前规划,具体实现细节可参见更多技术实现细节。
自查清单
- 列表接口是否有明确的耗时记录,能否区分数据库与应用层。
- 深页访问是否明显慢于前几页,排序字段是否有索引支撑。
- 总记录数是否每次请求都重新统计,能否缓存或估算。
- 前端页容量是否被设置得过大,是否存在拉全量再本地分页。
- 是否统计过台账主表的行数与年增量,归档边界是否与业务确认过。
- 历史数据是否有独立查询入口,普通用户是否能感知到差别。
- 归档后关联表的引用是否校验过,是否有对账或抽查机制。
- 冷热拆分方案是否评估过跨库统计的代价与长期维护成本。
- 归档任务是否具备失败重试与告警,是否可暂停与回滚。
- 涉及对接与权限的改造,是否已走通测试环境验收再上生产。
如果需要在现有系统上做归档改造或列表性能治理,可以从服务范围与交付流程了解我们通常的工作方式。