zoukankan      html  css  js  c++  java
  • Foreach嵌套Foreach速度慢优化方案

    有时候这样的效率还可以,但是只要牵涉到操作数据库,那就GAMEOVER。。

    最近在维护项目,一个Foreach循环,4分半才能出来结果。

    代码:

    foreach ($content as $key => $val) {

                $user = $userModel->where(array('username'=>$val))->Field('id,username')->find();

                if ($user) {

                    //查找群里是否存在

                    if(!$ck_group_userModel->where(array('uid'=>$user['id']))->Field('uid')->find()){                    

                        $data[] = array('id'=>$user['id'],'username'=>$user['username']);

                    }

                }else{

                    $id = $userModel->add(array('username'=>$val,'password'=>1234,'pid'=>9,'type'=>3));

                    $data[] = array('id'=>$id,'username'=>$val);

                }            

    }

     

    查询时候在群中这个操作极慢!!!数据库已经添加索引。。。

    考虑用户量太大,而且没有缓冲机制。只能一次次读库。

    修改优化方案:

    将循环查询和插入改为批量操作。减少操作数据库次数。

    优化代码:

    $userModel = M('user');

            $ck_group_userModel = M('ck_group_user');

            $data = array();

            $where['username'] = array('in',$content);

            $user = $userModel->where($where)->Field('id,username')->select();

            //根据java接口用户名,批量查询用户是否存在         

            for($i=0;$i<count($user);$i++){

                 $userid[$i]=$user[$i]['id'];

                 $newuser[$i]=$user[$i]['username'];

            }

            $newuser = array_flip($newuser);

            $newuser = array_flip($newuser);//去重

            $nouser = array_diff($content,$newuser);//不存在的用户

            if($nouser){//用户不存在

                foreach ($nouser as $key => $val) {

                    $dataList[] = array('username'=>$val,'password'=>'wanxue','pid'=>9,'type'=>3);//要批量插入的数据

                }

                $userModel->addAll($dataList);

                $con1['username'] = array('in',$nouser);

                $con1['pid'] = array('eq',$college_name['region_id']);

                $data = $userModel->where($con1)->Field('id,username')->select();            

            }else{

                //查找群里是否存在            

                $con2['uid'] = array('in',$userid);

                $ingroup = $ck_group_userModel->distinct(true)->Field('uid')->select();        

                for($i=0;$i<count($ingroup);$i++){

                 $ingroup[$i]=$ingroup[$i]['uid'];

                }            

                $nogroup = array_diff($userid,$ingroup);            

                $con3['id'] = array('in',$nogroup);

                $data = $userModel->where($con3)->Field('id,username')->select();            

            }

     

    优化后3S出来结果。

     

  • 相关阅读:
    计算一个未排序数组中排序后相邻元素的最大差值
    13 类对象的声明中加小括号{}和不加小括号{}的区别
    12 表中删除重复项
    11 常量区的内容不能被修改
    10 无向图的边
    顺时针旋转矩阵
    字符串的旋转
    动态规划算法
    贪心算法应用-最小生成树
    贪心算法应用-单元最短路径
  • 原文地址:https://www.cnblogs.com/lovebing/p/7772864.html
Copyright © 2011-2022 走看看