2 u013639005 u013639005 于 2014.10.10 13:38 提问

循环查询数据库500次和用双层for循环进行25w次轮循哪个效率更高

有两张表A、B。
A有500条记录,B有500乃至更多条,查询A表所有记录封装成List;
现根据A表的ID查询B表中对应的记录,那么

List<A> listA = getObjects(A.class);
for(A a : listA){/*循环查询数据库*/
  B b= getObjectById(a.getId());
  map.put("A",a.name);
  map.put("B",b.time);
}
List<B> listB = getObjects(B.class);
for(A a : List<A>){
  for(B b : List<B>){
    if(a.getId() == b.getAid())
      map.put("A",a.name);
      map.put("B",b.time);
  }
}

这两种方式哪个效率高

4个回答

u013639005
u013639005   2014.10.28 11:38
已采纳
List<A> listA = getObjects(A.class);
Map<Long,Object> mapA = new HashMap<String,Object>();
/*这里map的key是Object中的某一字段的类型,可以是int,string,long之类的*/

for(A a : listA){
 mapA.put(a.getId(),a);
}

List<B> listB = getObjects(B.class);
Map<String, Object> A_B = new HashMap<String, Object>();
for(B b : listB){
   A a = mapA.get(b.getAId());
   A_B.put("B",b);
   A_B.put("A",a);
}
/*这样就避免了N次查询数据库,提高执行效率了*/
u013540525
u013540525   2014.10.13 11:16

显然是第一种高效,嵌套循环明显次数更多啊

shendixiong
shendixiong   2014.10.13 16:29

我觉得是第二种。如果单纯的是代码,那的确是第一种。但是,你第一种方式是循环访问数据库!
而第二种只需一次访问!试问,你一个查询,要连续查询几百万次数据,这连接数真的无法想象。代价也是相当昂贵的!

u013639005
u013639005 谢谢回答,我找到一种方法已经发在回答里面,交流之用
3 年多之前 回复
wangcheng1983913
wangcheng1983913   2014.10.18 10:49

就我工作经验而言,做过的项目中,通常要考虑的是尽量减少数据库的连接
一方面是访问数据库本身,建立连接,释放连接,对数据库本身就会造成很大的负担,而且效率很低。
能一次访问就一次访问。
另一方面SQL文的执行次数过多,也会较低效率。
这种的效率的低,跟java本身25w次循环是不能比的。
所以还是第二种好一些。

其实更好的解决方案应该是根据数据的查询要求,将两个表合并写成一个检索SQL文(两层SELECT),数据直接取得后,返回赋值。
SELECT
XXX
FROM
(SELECT XXX
FROM A
WHERE ....
) AS TEMP, B
WHERE A.ID = B.ID
....

u013639005
u013639005 谢谢回答,我已经有了更好的方法,拿出来分享一下,有所不足,也请指教。下面是代码:
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于执行两个for循环效率注意点
问题: for(i=0;i for(j=0;j {} for(j=0;j for(i=0;i {} 这两个程序哪个执行效率高? 解答: for(i=0;i for(j=0;j {} 效率高 双层循环,较长的循环放在内层效率要高 for(j=0;j for(i=0;i {} 这样内层循环要构造100次,所以频繁的在循
两重for循环的效率对比
int a[n][m] for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ // a[i][j] } }for(int j=0;j<m;j++){ for(int i=0;i<n;i++){ // a[i][j] } }以上两个循环的效率谁比较高: 对于现代数组来说,都是行存储优先:a[0][0]
请教下关于For循环和mysql的IN查询哪种效率高一些?
一般来说是后者效率高一些。原因是这样: 多次执行语句,与数据库进行了多次交互,网络传输以及mysql解析和执行sql语句都需要处理多次; for循环内执行sql语句会占用连接池连接,数据库连接池可能被耗尽。 如果in的字段建了索引in也是会用到的,所以结果就如楼上所说使用for循环会多很多次query的过程,很多时间消耗在网络请求上面。 一般做过代码分析的都知道,p
哪一种java循环方式性能最高
public class LoopTest { private static List<Integer> list = new ArrayList<Integer>(1000000); static { for (int i = 0; i < 10000000; i++) { list.add(i); }
循环查询数据库N次和用多层for循环进行N次轮循选择
尽量避免循环访问数据库,所以选择先把list放在Map中,再由第二个for循环通过键取值 List listA = getObjects(A.class); Map mapA = new HashMap(); /*这里map的key是Object中的某一字段的类型,可以是int,string,long之类的*/ for(A a : listA){ mapA.put(a.getId(),a);
双重for循环语句块的优化
    双重循环语句的书写,是有讲究的。不同的书写方式,效率会大不一样。有如下代码模块:    typename tArray[20][600];    uint32 uIdxI = 0;   //uint32 is short for unsigned int    uint32 uIdxJ = 0;    for (uIdxI = 0; uIdxI     {     
两层嵌套for循环的效率比较
情况一:两层for循环,外层循环次数为1000000,内层循环次数为10。 情况二:两层for循环,内层循环次数为1000000,外层循环次数为10。 正常情况下,次数多的循环放在内层,会减少cache更新数据的次数,当离开内层循环的时候会恢复外层的计数器,外层循环次数越少,恢复计数器的次数越少,效率较高,由此看来情况二更加高效。 从cpu指令执行机制上来分析,因为基本所有cpu都有
for循环里面进行数据库查询的处理
public class { public static void main(String[] args) { List list = productDao.getProudctList(map);//获取产品列表 if (list.size() > 0) {//如果列表为空 Map map2 = new HashMap(); List proList =new
使用Map对于两层for循环的一个优化
使用Map的get方法来对某些情形下的f多重or循环进行优化。 没有优化前代码List> result = new ArrayList<>(); List> result1 = new ArrayList<>(); List> result2 = new ArrayList<>(); result1 = CITService.queryComplianIndexLastDay(); result
递归与循环的效率问题
递归与循环的效率问题 一摆案例: Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。(0) 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。 要求:1s内,256M内 考点:1简单循环的效率比递归高;2.利用10007的余数巧妙避开了大数BigInter操的作(这个类的操作效率很慢)。 那么这个时候平时算法学得好的童鞋都会