博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Foreach嵌套Foreach速度慢优化方案
阅读量:5763 次
发布时间:2019-06-18

本文共 1729 字,大约阅读时间需要 5 分钟。

有时候这样的效率还可以,但是只要牵涉到操作数据库,那就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出来结果。

 

转载地址:http://lmgkx.baihongyu.com/

你可能感兴趣的文章
[CLR via C#]5.4 对象哈希码和dynamic基元类型
查看>>
【R】R语言常用函数
查看>>
在Eclipse中点击ctrl+h打开搜索界面,范围指定的项目中搜索包含person的文件
查看>>
enum hack
查看>>
jira部署,主机迁移,数据库迁移,jira
查看>>
送给前线码农的话 – 大牛们的经典语录---摘抄了不少经典的好词好段,虽是只言片语,但都是心得。(转)...
查看>>
js中查找一个字符是否存在。
查看>>
Android Handler Demo
查看>>
vi常用命令
查看>>
ActiveX 控件漏洞挖掘之方法
查看>>
sqlserver表分区
查看>>
梦想的地方!地球上最值得去的20个地方【组图】
查看>>
nyoj 15 括号匹配(2)
查看>>
502 bad gateway 可能的错误原因
查看>>
VC添加背景图片 的一种方法
查看>>
【2014年5月份日常记录表(2014.5.1—5.31,31天)】
查看>>
WebMisSharp,WebMisCentral,企业框架正则表达式规则共享专版
查看>>
我也要谈谈大型网站架构之系列(3)——死了都要说的缓存
查看>>
【超酷超实用】CSS3可滑动跳转的分页插件制作教程
查看>>
js createElement appendChild createTextNode用法
查看>>