Excel导出数据过慢,1k条到10k条

954 阅读3分钟

- 1、需求

同步导出1万条订单数据,订单导出文件中,需要包含订单信息、商品信息、收货人信息以及佣金信息。

- 2、现状

image.png

image.png

- 3、问题排查

3.1 检查低效SQL

3.1.1 使用group by 替代 distinct

image.png

image.png

3.1.2 使用批量查询 替代 单个查询

image.png image.png image.png

image.png

3.2 检查不合理代码

image.png

3.3 检查耗时流程

image.png

image.png image.png image.png image.png

image.png image.png

3.4 与产品经理了解导出的应用场景

我拿着这个问题,去找了我们的架构师,于是上演了一场“淡定哥”和“结巴哥” 的戏码
产品经理:订单导出要支持超过1w张订单
架构师:是什么业务场景下要导出超过1w张订单?
产品经理:我们的业务有这个需求嘛,有时会需要导出超过1万张订单的数据嘛,比如说我们的管理员有需要的时候,要导出超过1万的数据的话,怎么办呢?
架构师:第一数据泄露问题:订单导出的文件中,包含了很多信息,订单信息,商品信息,收货人信息等,一下子导出过万数据,不安全。第二使用频率低,按照你的说法,使用频率是很低的。所以不建议做,订单导出支持1万条就够够的了,我们之前都是支持1千条的。
产品经理:那...那...那还是要支持超过1万呀,如果需要导出超过1万的话,怎么搞?
架构师:如果到时候真的需要的话,让业务直接找我们开发或运维就可以了,这种使用频率不高又涉及到敏感数据的功能,不能随便导出大量数据的。
产品经理:那...那...那太麻烦了呀,还是要支持超过1万呀。
架构师:(翻白眼....)
在最后,架构师让我先别理会产品经理,先做限制1万就好了,没必要支持超过1万。

所以,充分了解功能的业务场景,在完成需求时,非常重要。要不然会白费力气

- 4、优化Excel导出总结

4.1 确定使用场景需求

千万别像我一开始,我没有第一时间去和产品经理沟通确认需求,而是一波操作猛如虎,什么创建单个线程处理、创建多个线程处理,都搞一波,通过沟通确认了后,架构师说不需要。白费力气。

4.2 确定耗时步骤

要优化,首先要知道是哪个步骤耗时较长,先不慌,要淡定。

4.3 代码优化

特别要注意,不合理的遍历,在遍历里不合理的操作,能在遍历外操作的都移到遍历外

4.4 增加批量SQL

这个不用多说啦,一般能批量查询就批量查询啦,减少连接数据库的次数,减少响应时间

4.5 添加索引

如果数据量大的话,需要考虑添加索引

4.6 项目运行环境

当我们需要导出大批量的数据时,也要考虑我们的服务器是否能够承受住,否则会出现java heap space:out of memory(OOM)

image.png

- 5、效果对比

优化前: image.png 优化后:

image.png image.png