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

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

前言

前些天分享了一个导出数据到 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 服务器挂掉。

写在末尾

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

往期精彩

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


相关文章
|
存储 缓存 JavaScript
缓存组件状态,提升用户体验:探索 keep-alive 的神奇世界
缓存组件状态,提升用户体验:探索 keep-alive 的神奇世界
缓存组件状态,提升用户体验:探索 keep-alive 的神奇世界
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
2736 0
Threejs实现相机视角切换,平滑过渡,点击模型切换到查看模型视角
|
6月前
|
SQL 存储 缓存
海量数据分页查询效率低?一文解析阿里云AnalyticDB深分页优化方案
本文介绍了AnalyticDB(简称ADB)针对深分页问题的优化方案。深分页是指从海量数据中获取靠后页码的数据,常导致性能下降。ADB通过快照缓存技术解决此问题:首次查询生成结果集快照并缓存,后续分页请求直接读取缓存数据。该方案在数据导出、全量结果分页展示及业务报表并发控制等场景下表现出色。测试结果显示,相比普通分页查询,开启深分页优化后查询RT提升102倍,CPU使用率显著降低,峰值内存减少至原方案的几分之一。实际应用中,某互联网金融客户典型慢查询从30秒优化至0.5秒,性能提升60+倍。
429 1
|
5月前
|
存储 数据采集 监控
什么是数据中台,一文读懂数据中台核心功能
在数字化浪潮下,数据成为企业核心资产。然而,数据分散、质量参差、使用效率低等问题困扰企业发展。数据中台应运而生,作为企业的“中枢神经”,它通过整合、治理、分析和共享数据,打破信息孤岛,提升数据价值,助力企业在营销、风控、产品创新和运营等方面实现数据驱动决策。本文深入解析数据中台的概念、功能、应用场景及建设路径,帮助企业理解如何构建高效的数据能力平台,推动业务增长。
|
7月前
|
存储 弹性计算 人工智能
阿里云服务器ECS实例规格选型指南:根据使用场景选择合适的配置
随着云计算的快速发展,阿里云提供了丰富多样的云服务器ECS实例规格,满足不同用户需求。然而,面对众多选项,新手往往难以抉择。本文详细解析八大业务场景,包括新手入门、网站业务、数据库、大数据、游戏、视频、AI机器学习及高性能计算等,帮助用户精准选择合适的实例规格。通过了解各实例的硬件配置与软件优化特点,用户可实现资源高效利用与成本合理控制,推动业务发展。更多详情与性能参考可访问阿里云官方文档。
397 17
|
人工智能 算法 搜索推荐
从调研到交付,双钻设计模型如何贯穿整个设计流程?
2分钟带你了解双钻设计模型及其实操
499 2
从调研到交付,双钻设计模型如何贯穿整个设计流程?
|
9月前
|
机器学习/深度学习 人工智能 算法
传统笔触与算法洪流:AI时代的艺术创作挑战
本文探讨了传统艺术与AI技术在创作中的共生关系及其对艺术生产力的赋能。研究表明,混合工作流能显著提升效率,而传统媒介带来的“意外美学”与AI生成的跨时空意象拼接相辅相成。AI通过快速生成视觉原型、优化色彩方案和提供即用元素,极大加速创作过程。同时,人机协同可实现风格融合、逆向思维训练及动态知识网络构建,但创作者需建立风格防火墙、验证机制和价值评估体系以守住创作主权。未来艺术教育将涵盖多层能力培养,具备跨维能力的艺术家市场竞争力将大幅提升。最终,真正成功的创作者是能够融合传统与科技、让艺术回归情感表达本质的“双脑创作者”。
382 0
|
运维 监控 供应链
你真的了解物联网卡吗
"你真的了解物联网卡吗?" 这个问题触及了物联网(IoT)领域中的一个关键组成部分——物联网卡。为了深入回答这个问题,我们可以从以下几个方面进行解析和操作:
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。
213 0
|
监控 安全 Java
五大权限系统模型该如何选择?
五大权限系统模型该如何选择?
902 0