性能优化利器——预计算(含报表场景实践)

写在前面

很多人觉得工作像是无尽的CRUD,实际上工作场景中包含很多值得思考的可以性能优化的点。针对数据而言,比较常见的性能优化方式有两种,一种是 cache, 一种是预计算。本篇文章会介绍后者。

什么是预计算?

预计算和cache一样,都是在用空间换时间,顾名思义,将计算提前到更早的阶段(比如数据导入阶段),可以减少查询时的耗时与成本。

预计算在报表场景的实践

背景

报表是一个常见的业务场景,为了展示不同纬度的业务数据,我们需要在一个页面中展示不同维度不同展现形式的的报表。从技术角度,前端页面会同时发送多个请求至服务器,并接受服务器返回的结果。

以工单系统为例,我们可能需要查看一定时间内工单相关的数据(比如成功率、发起工单数),以及一定时间内用户相关的数据(比如每日使用次数、新增用户/留存率),假如这些数据存在一张表中,那我们可能会根据请求数据的不同编写不同的sql。

举个例子

然而同一时间的多个sql必然会带来耗时的增加,既然数据存在于一张表中,那是否可以只查询一次拿取所有需要的数据呢?

如图,通过一次性查询结果并根据请求的需要进行初步的计算再返回给浏览器,这样的好处是减少了因SQL查询而导致的网络传输的次数(网络传输向来是查询数据场景中耗时的大头)

不足之处

这里面有一个漏洞,就是多个请求其实是同时发送,那么让多个请求等待一次网络请求的结果本身也是一个耗时点,在第一个请求抢锁并查询数据的时间里,其他的请求其实都是阻塞等待的,而其他的请求不断的轮询本身也会造成CPU资源的挤占,需要根据场景设计等待时间

究其本质

前面说了,预计算和cache一样,都是在用空间换时间

如果我们在数据导入阶段就计算出不同的用户数据,那么虽然多个sql会增加网络传输耗时,但无论是DB还是Server的计算消耗却都没有了

写在最后

两种思路我觉得都有可取之处,有趣的是,究竞哪个思路查询更快并不是一个静止的答案,而是需要综合考虑自己的报表个数,查询数据量级等多个条件。

相关推荐
irving同学462381 分钟前
TypeScript 后端入门全景:Hono + Zod + Drizzle + PostgreSQL
前端·后端
百珏3 分钟前
[灰度发布]:灰度流量如何匹配与识别:从特征补全到网关命中引擎
java·后端·架构
Reart5 分钟前
csapp 第三章 3.2.2 x86-64 函数调用约定:寄存器分工与c语言转汇编学习(未完成版)
后端·计算机组成原理
dinl_vin16 分钟前
FastAPI 系列(一)· 初体验——从 Spring Boot 工程师视角认识 FastAPI
后端·python·fastapi
ping某25 分钟前
Nginx 内嵌 CPython 3.5→3.8 升级实录
后端
vx-程序开发26 分钟前
springboot课程管理系统-计算机毕业设计源码16731
spring boot·后端·课程设计
stark张宇26 分钟前
支付宝 App 支付踩坑记:x509 证书不匹配 & 应用未上线问题解决
后端·支付宝
MacroZheng32 分钟前
IDEA + 阿里 Qoder = 王炸!
java·人工智能·后端
鹏程十八少40 分钟前
Android 无障碍服务失效,一次AccessibilityService“离奇死亡”的完整破案实录
前端·后端·面试
_Evan_Yao1 小时前
从 select 到 epoll,再到 Agent 循环:如何用 I/O 多路复用撑起千军万马?
java·数据库·人工智能·后端