怎么解决后台查询慢的问题呢?

怎么解决后台查询慢的问题啊?
总共有19个站,全选的话,后台循环查询需要4分钟,然后就把sql语句#{ }换成了${ },快了点,但是有没有其他办法让查询时间更快一点啊

img

img

@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性能优化看这一篇就够了 - 知乎
供参考

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

循环里面去查库这不慢都没天理