System.out.println(t3-t2+"ms查所有一级部门预算时间");
System.out.println(depExpInfoStatlist.size()+"一级部门数量");
for(int i=0;i<depExpInfoStatlist.size();i++) {
depExpInfoStat = depExpInfoStatlist.get(i);
depId1 = depExpInfoStat.getDepId();
budgetYear1 = depExpInfoStat.getBudgetYear();
budgetAmount = depExpInfoStat.getBudgetAmount();
if(budgetAmount==null) {
budgetAmount =new BigDecimal(0);
}
depExpInfoStat1 =iAgencyExpDao.queryAllDepExpStatic(depId1,budgetYear1);
noExpOver = iAgencyExpDao.queryNoExpOver(depId1,budgetYear1);
}
long t4 = System.currentTimeMillis();
System.out.println(t4-t3+"所有数据处理完");
System.out.println(depExpInfoStatlist.size()+"一级部门数量");
for(int i=0;i<depExpInfoStatlist.size();i++) {
depExpInfoStat = depExpInfoStatlist.get(i);
depId1 = depExpInfoStat.getDepId();
budgetYear1 = depExpInfoStat.getBudgetYear();
budgetAmount = depExpInfoStat.getBudgetAmount();
if(budgetAmount==null) {
budgetAmount =new BigDecimal(0);
}
depExpInfoStat1 =iAgencyExpDao.queryAllDepExpStatic(depId1,budgetYear1);
noExpOver = iAgencyExpDao.queryNoExpOver(depId1,budgetYear1);
}
long t4 = System.currentTimeMillis();
System.out.println(t4-t3+"所有数据处理完");
mysql多个字段同时in
并不需要查询多次,只要构造好参数,sql只查一次,把所有数据查出来,然后再循环
慢的是网络IO,在内存中循环的时间可以忽略不计
对,优化下sql索引或者where 顺序 调整下
然后呢套路如下:
1.代码效率低下,这种情况很少,各种无脑的for循环嵌套,处理的方法就是优化代码,清晰的逻辑写出来的代码干净又有效率。
2.sql冗长且无关数据太多,处理的方法就是只查自己需要的,没事别乱取数据,比如你只用A字段结果拿了个类型为text的B字段,当然回慢下来。
3.数据量大,这种情况下最为复杂,
对于经常查询但极少更改的数据,做缓存这个方法最简单,效果又好;
加适当的索引,会极大程度上的提升查询效率,但是乱加索引会影响其他的效率,比如增删改;
绝大部分情况下,避免N+1,数据库连接也是耗时间的,10ms一次1000次那耗时就上去了,能再sql层面直接取出连接好的数据,就直接去,不能直接取可以分两次取出后再代码里连接。极少数情况下N+1是可取的,这种情况很特殊,并不是所谓的一定不能写N+1
总的来说,优先定位原因,根据原因对应的处理就好了。