某产品系统代码性能优化及代码规范问题整理

1、存在的问题

1.1 复杂SQL查询效率缓慢。

1.2 导出功能速度太慢,并且Http请求存在超时报错。

2、解决与优化方案

2.1 数据库表优化

对于整个数据库,大概看了一下,目前整个系统,MySQL表设计的时候,一些新增的字段不符合设计规范。

例:一些只有长度10以内的VARCHAR字段,给了255的长度。

解决方案:需要全库review,将表字段重新定义长度。

2.2 select *

一些全量查询的复杂SQL,由于全表查询,本身速度就很慢了,但是还是存在select * 的写法,那么表里面的is_deleted、update_time、update_by这几个字段,业务上是否真的需要?

解决方案:需要将复杂SQL的select * 改写为具体需要的字段。

2.3 pagehelper的count问题

一些复杂的SQL,由于pagehelper自带的count分页统计的默认SQL会不走索引,导致count的速度非常慢。、

解决方案:需要将这些SQL在mapper层和xml层对count进行重写。

2.4 禁止使用having

禁止使用having关键字。有些地方可能会存在先分组,sum或者count统计数量,最后再用条件匹配这个统计的值,请不要在最后使用having。

解决方案:使用子查询+where的方式替代having。

2.5 导出功能优化

(1)从运行速率层面来优化

[1] 有些地方会存在多个全量查询的SQL,然后分别拿到这些LIST,传递到EXCEL中进行导出,这里可以使用开启多线程的方式,例如是4个全量查询,那就开启四个线程,让这四个线程同时去查询数据。最后当所有线程都完成了,再join入主线程。

[2] 从sheet维度:如果是多个sheet,那么可以对于sheet的颗粒度进行优化,开启多个线程异步去对多个sheet进行异步写入数据。

[3] 从行的维度:如果是单个sheet,但是数据量太大了,可以对万行的颗粒度进行优化,开启多个线程异步从不同的行数起点,去进行异步写入数据。

(2)从用户使用层面来优化

前后端使用异步+任务表的方式来对导出功能进行优化。

[1] 前端发起http请求,后台创建task任务,保存到task表中,将task_id传入异步线程中,然后返回前端200。

[2 ]前端自动弹出任务列表,可以看到当前导出任务信息、状态:导出中。

[3] 后台的异步线程继续运行导出任务,当导出完毕后,将文件输出到服务器,然后根据task_id去更新这条导出任务的状态为:已完成。

[4] 前端可以通过轮询的方式,去获取任务列表,然后用户可以看到该任务的状态为已完成,然后点击可以从服务器下载该文件。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务