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

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

前言

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

写在末尾

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

往期精彩

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


相关文章
|
SQL 关系型数据库 MySQL
MySQL数据库的数据导入和导出操作指南
MySQL数据库的数据导入和导出操作指南
|
2月前
|
监控 关系型数据库 MySQL
如何优化MySQL数据库的索引以提升性能?
如何优化MySQL数据库的索引以提升性能?
121 0
|
4月前
|
SQL 缓存 关系型数据库
提高SQL查询性能的技巧
【7月更文挑战第26天】提高SQL查询性能的技巧
51 3
|
6月前
|
缓存 关系型数据库 MySQL
如何优化MySQL数据库查询性能
MySQL是一款常用的关系型数据库,但在实际使用过程中,由于数据量增加和查询操作复杂度增加,会导致查询性能下降。本文将介绍一些优化MySQL数据库查询性能的方法。
|
6月前
|
存储 缓存 NoSQL
《优化数据库性能的关键技巧》
在当今信息爆炸的时代,数据库扮演着至关重要的角色。本文将分享一些关键的技巧,帮助开发人员优化数据库性能,提升系统的响应速度和稳定性。
|
6月前
|
SQL 存储 缓存
如何通过优化SQL查询提升数据库性能
SQL查询是数据库的核心功能之一,对于大型数据量的应用程序来说,优化SQL查询可以显著提升数据库的性能。本文将介绍如何通过优化SQL查询语句来提升数据库的性能,包括索引优化、查询语句优化以及其他一些技巧。
|
6月前
|
存储 SQL 关系型数据库
PolarDB-x 比mysql查询性能怎么样?速度快吗
PolarDB-x 比mysql查询性能怎么样?速度快吗
312 0
|
SQL 存储 关系型数据库
一条SQL查询出MySQL数据库中所有表的数据量大小
一条SQL查询出MySQL数据库中所有表的数据量大小
1150 0
|
关系型数据库 MySQL 程序员
使用Mysql Navcat导出查询数据excel时出现数据丢失
使用Mysql Navcat导出查询数据excel时出现数据丢失
143 0
|
存储 SQL 安全
如何提高加速数据泵的操作性能
如何提高加速数据泵的操作性能
470 0