怎么解决后台查询慢的问题啊? 总共有19个站,全选的话,后台循环查询需要4分钟,然后就把sql语句#{ }换成了${ },快了点,但是有没有其他办法让查询时间更快一点啊
@Override
public Object selectTotal(JNameVo jNameVo ) {
DecimalFormat decimalFormat = new DecimalFormat("0.00" ) ;
List syzNameList = jNameVo.getSyzName() ;
List object = new ArrayList<>() ;
if (ListUtil . isNull(syzNameList ) ) {
syzNameList = jSyzinfoMapper.selectName() ;
}
if (StringUtil . isNotEmpty(jNameVo .getStartTime () ) && StringUtil . isNotEmpty(jNameVo .getEndTime () )) {
for (String name : syzNameList) {
Map data = new HashMap<>() ;
JRbhis Total = jRbhisMapper.selectTotal(jNameVo .getStartTime () , jNameVo.getEndTime() , name);
if (Total!=null){
data.put("syzName" , name);
data.put("energy" , Total . getEnergy() );
data.put("energyLj" , Total . getEnergyLj() );
data.put("syje" , Total . getSyje() );
data.put("power" , Total . getPower() );
data.put("flow" , Total . getFlow() );
data.put("row" ,object .size() +1 );
//判断时间是否到了每年的11月15号,不到11月15号,按上一年11月15号开始查
String date = jNameVo.getStartTime() ;
String[] dateRange = getDateRange(date ) ;
if (dateRange != null && dateRange.length >0 ) {
String startDate = dateRange[0 ] ;//改过的时间
String endDate = dateRange[1 ] ;//原本时间
JRbhis jenergy = jRbhisMapper.selectTotal(startDate , jNameVo .getEndTime () , name);
data.put("jenergy" , Total . getEnergy() );
}
}else {
data.put("syzName" , name);
data.put("energy" , 0 );
data.put("energyLj" , 0 );
data.put("syje" , 0 );
data.put("power" ,0 );
data.put("flow" , 0 );
data.put("row" ,object .size() +1 );
data.put("jenergy" , 0 );
}
object .add(data);
}
}
return object ;
}
<select id="selectTotal" resultType="com.hnzy.ymserver.entity.JRbhis">
select a.syzName,a.energy,a.energyLj,b.syje,b.power,b.flow from
(select max(energy)-min(energy) as energy , max(energyLj)-min(energyLj) as energyLj,syzName from J_RbHis
where recordTime>= '${startTime}' and recordTime <= '${endTime}'
group by syzName) a,
(select * from J_RbInfo) b
where a.syzName=b.syzName
and a.syzName = '${syzName}'
select>
1.你可以根据jNameVo.getStartTime(), jNameVo.getEndTime(), name 先查总数数据。 2.处理集合,然后在做集合循环操作、这样就会很快。 3.你循环操作数据库是磁盘操作,你先全部查出来成list,然后处理集合时内存操作。内存操作比磁盘操作快!!! 代码思路: select * from xxx where name in ('xxxx','xxx') and ......
不要循环去查,一次把符合条件的所有数据查询出来 在代码里去处理
数据量小的话可以将数据全部查出来,然后再内存中处理,但是数据量大,会有内存溢出的风险 你的思路可能有问题。 既然知道了 syzName值 就先查出 根据 syzName 查出J_RbHis的最大和最小值,然后再去关联J_RbInfo 查询
a 那个子查询里面加个syzName=#{syzName}的条件
前端传需要查询的站,给你传数组或者用都开拼接的,如传“1,2,3”,sql再把对应的站拼起来,一次性查询出来 sb.append(" and TEST in ('"+ VO.TEST().replaceAll(",", "','")+"')");
select * from test where syzName in ('1','2','3')这样
Sql性能优化看这一篇就够了 - 知乎 供参考
不知道你这个问题是否已经解决, 如果还没有解决的话:
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
循环里面去查库这不慢都没天理