- 1、需求
同步导出1万条订单数据,订单导出文件中,需要包含订单信息、商品信息、收货人信息以及佣金信息。
- 2、现状
- 3、问题排查
3.1 检查低效SQL
3.1.1 使用group by 替代 distinct
3.1.2 使用批量查询 替代 单个查询
3.2 检查不合理代码
3.3 检查耗时流程
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)
- 5、效果对比
优化前:
优化后: