循环内部有一条sql,造成程序执行缓慢,请问有什么好的办法?

for (Record wd : wds) {
        String wdid = wd.getStr("wdid");
        Integer sum = 0;
        for (Record xx : psyXuanxiangs) {
            String tmid = xx.getStr("tmid");
            String daid = xx.getStr("daid");
            try {
                Integer fen = Db.queryInt("select fen from psy_dwd where tmid=? and daid=? and wdid=?", tmid, daid, wdid);
                sum = sum + fen;
            } catch (Exception e) {

            }

        }
        wdfen.put(wdid, sum);
    }

    System.out.println(JsonKit.toJson(wdfen));

}

上面的代码中,有一条sql位于循环内部,造成系统非常缓慢,如果拿出来的话,用程序逻辑来写,比sql语法又多得多,同样也缓慢,不知道有什么样好的解决方案吗?

评论区

zzutligang

2021-05-25 22:46

两层循环内执行查询,每次执行,都要一次数据库访问的过程,当然效率就慢了。建议先构造条件,然后把把条件合并到sql语句里,然后一次执行数据库查询,可以极大提高效率。

杜福忠

2021-05-26 00:44

先做简单优化,看效果咋样:
psy_dwd 表增加( tmid,daid,wdid )联合索引,以及尾部增加 LIMIT 1
不行的话再优化其他的

要输就输给追求

2021-05-26 11:38

不知道你的具体业务是怎样的。List fen_list = Db.find("select fen,tmid,daid from psy_dwd where wdid=?",wdid); 这一句代码放第3行后面。fen_list.stream().filter(fen->tmid.equals(fen.getStr("tmid")) && daid.equals(daid.getStr("daid"))).findFirst().ifPresent(fen->{
sum += fen.getInt("fen");
}); 这个放第二个for循环里面。这样每一个wdid就只会执行一次数据库查询。

超级大富

2021-05-26 16:51

这种统计类的,建议还是新建一张专门的新表,执行一条sql 即可

北流家园网

2021-05-27 07:57

嵌套子查询select fen,tmid,daid from psy_dwd,(select sum(fen) sfen from psy_dwd where tmid=? and daid=? and wdid=?)) where wdid=?

tinshen

2021-05-27 18:04

没有这个sql没有所有所以查询的时候是filesort速度会非常慢.

steven_lhcb_9527

2021-08-05 16:06

wds.stream().forEach(wd->{
String wdid= wd.getStr("wdid");
IntSummaryStatistics statistics = psyXuanxiangs.stream().collect(Collectors.summarizingInt(xx -> Db.queryInt("select fen from psy_dwd where tmid=? and daid=? and wdid=?", xx.getStr("tmid"), xx.getStr("daid"), wdid)));
wd.set(wdid,statistics.getSum());
});