数据表里数据只存储年,月,月份数据,然后下载导出时候还需要我们导出年份统计数据。
正常情况下,我们是会取出数据,然后数据处理,处理过程一般是:循环遍历然后在循环里拿到每一条数据的主键,再从表里group by得到年份统计数据,
SELECT sum(valueOfMonth) from XX where projectCode= xx and year = xx
存放在循环体list里,最后数据处理完成,导出。
但是,处理过程执行sql,如果导出100万条数据,100万次循环处理过程会执行100万次sql,会导致速度奇慢无比而且可能内存溢出。
上面问题是执行sql次数太多,我们想要执行1次sql,取出我们想要的年份数据,然后数据处理时把对应projectCode的年份数据赋值就行,不需要每次循环里都去sql查年份数据。
那如何只通过1次sql就能得到所有年份数据是这个优化的关键
SELECT projectCode,year,sum(valueOfMonth) from XX GROUP BY projectCode,year
得到年度统计数据,存放map里,map.put(projectCode+year,sum(valueOfMonth))
然后导出数据循环遍历里拿到每一条数据的projectCode和year,再从map里直接get(projectCode+year)得到年份统计数据,这样对数据处理就替代了执行sql重新去查年度数据
适当用map存储数据替代万次的sql查询,当然这只是可能会遇到的一种情况,优化前需要问题定位,至于其他情况我们遇到再说。
收藏几个自己觉得不错的帖子,仅供自查: