有关提高导出数据性能的一些思考和总结

简介: 有关提高导出数据性能的一些思考和总结

前言

前些天分享了一个导出数据到 Excel 的方案(参见前文 分享一个导出数据到 Excel 的解决方案),公司里有几位童鞋问了 2 个比较有意思的问题:

  1. 问题 1:

导出数据到 Excel 的最常见的场景,就是在一个列表页中,用户习惯先查询一次数据显示在列表中,然后再查询一次数据进行导出的操作,这样相当于查询了两次数据库,如果数据比较大,数据库压力就比较大,有没有方法优化性能?

  1. 问题 2:

ASP.NET Web Api 要导出的数据中包括有图片,当导出的数据超过 1000 条时,32G 的内存基本就被占满了,使用多线程或者异步,都没有改善,有没有办法进行优化?

关于问题 1的思考和总结

先查询数据显示在列表,然后再查询数据进行导出,确实是很常见的业务场景,

它们的查询方法基本上是相同的,区别在于显示在列表的数据通常会做分页处理,即一次只查预定义好的数量(比如 10 条)的数据,而后者则往往需要查出全部数据,

所以往往需要两个方法来进行处理,

这样除了数据比较大,多次查询有性能问题之外,

还有 SQL 语句维护的问题,比如页面增加一个查询条件,或者增加一个字段,则两个方法就都需要修改,而在实践中,程序员往往会漏了其中一个修改,在上线后带来问题。

但是这样做其实也是有一定的合理的原因的,比如用户不一定会导出数据,多页的小批量多次查询,对数据库的压力不会很大等等。

对于这个问题的性能优化,我倒是想到的一个优化方法,

就是一次查出全部的数据,将它存储在中间件中,比如内存、Redis 或其它存储器中,

分页和导出的时候,直接操作存在中间件中的数据,

由于是在内存中,速度会很快,对数据库的请求也只有一次,大大地减轻数据库的压力,

但是这样也有一些弊端,比如数据的保存和释放时机等等,

关于问题 2的思考和总结

问题 2 我觉得可以通过使用分布式进行优化,具体优化步骤如下:

  1. 创建一个任务表,目的是存储导出任务,充当中间件的用途。
  2. ASP.NET Web Api 直接将导出任务和查询数据的 SQL 语句存储到任务表,然后返回一个状态,告诉用户正在排队导出中,过一段时间再刷新页面查看导出结果。
  3. 在另一个机器(只做导出任务),部署一个 Console 程序(或 Windows 服务),开启 2 个线程,其中一个线程每隔一段时间就扫描一次任务表,如果有任务,就将任务放进队列中;另外一个线程就循环这个队列,执行 SQL 语句,导出数据。
  4. 每导出结束,就更改任务表的状态,将导出的文件放到指定的目录。

这样有 2 个好处:

  1. 导出和 WEB 分开两个机器,导出的任务不会占用 WEB 机器的内存,不影响网站的服务。
  2. 统一管理导出任务,队列每次只进行一次导出任务,反而性能更好。WEB 可能不同用户同一时间段有不同的导出行为,反而会让 WEB 服务器挂掉。

写在末尾

你觉得我提供的这两个优化方案可不可行呢?你有更好的方案吗?欢迎留言讨论

往期精彩

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步


相关文章
|
10月前
|
JSON NoSQL 测试技术
从手动到全自动:我们如何用Dify重构了API回归测试流程
本文分享团队如何借助Dify工作流平台,将耗时3天的手动API回归测试升级为3小时完成的全自动流程,实现测试效率与质量双提升,推动测试从成本中心向价值创造转型。
|
SQL 存储 缓存
海量数据分页查询效率低?一文解析阿里云AnalyticDB深分页优化方案
本文介绍了AnalyticDB(简称ADB)针对深分页问题的优化方案。深分页是指从海量数据中获取靠后页码的数据,常导致性能下降。ADB通过快照缓存技术解决此问题:首次查询生成结果集快照并缓存,后续分页请求直接读取缓存数据。该方案在数据导出、全量结果分页展示及业务报表并发控制等场景下表现出色。测试结果显示,相比普通分页查询,开启深分页优化后查询RT提升102倍,CPU使用率显著降低,峰值内存减少至原方案的几分之一。实际应用中,某互联网金融客户典型慢查询从30秒优化至0.5秒,性能提升60+倍。
917 1
|
存储 弹性计算 人工智能
阿里云服务器ECS实例规格选型指南:根据使用场景选择合适的配置
随着云计算的快速发展,阿里云提供了丰富多样的云服务器ECS实例规格,满足不同用户需求。然而,面对众多选项,新手往往难以抉择。本文详细解析八大业务场景,包括新手入门、网站业务、数据库、大数据、游戏、视频、AI机器学习及高性能计算等,帮助用户精准选择合适的实例规格。通过了解各实例的硬件配置与软件优化特点,用户可实现资源高效利用与成本合理控制,推动业务发展。更多详情与性能参考可访问阿里云官方文档。
712 17
|
人工智能 算法 搜索推荐
从调研到交付,双钻设计模型如何贯穿整个设计流程?
2分钟带你了解双钻设计模型及其实操
998 2
从调研到交付,双钻设计模型如何贯穿整个设计流程?
|
人工智能 自然语言处理 JavaScript
通义灵码上线 @workspace 新能力,结合当前代码仓库理解工程、代码查询与问答等
通义灵码上线 @workspace 新能力,结合当前代码仓库理解工程、代码查询与问答等
1344 1
|
SQL XML Java
MyBatis-Plus联表查询(Mybatis-Plus-Join)
MyBatis-Plus联表查询(Mybatis-Plus-Join)
MyBatis-Plus联表查询(Mybatis-Plus-Join)
|
智能硬件
Wi-Fi 与蓝牙:差异解析
【8月更文挑战第24天】
4068 0
|
运维 监控 供应链
你真的了解物联网卡吗
"你真的了解物联网卡吗?" 这个问题触及了物联网(IoT)领域中的一个关键组成部分——物联网卡。为了深入回答这个问题,我们可以从以下几个方面进行解析和操作:
|
Linux iOS开发 MacOS
[已解决]ModuleNotFoundError: No module named ‘tqdm‘
[已解决]ModuleNotFoundError: No module named ‘tqdm‘