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

 

最新文章

  1. iOS系列 基础篇 06 标签和按钮 (Label &amp; Button)
  2. (一)SQL Server分区详解Partition(目录)
  3. php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径
  4. STM32 ADC 测电压
  5. mysql-异常Incorrect string value: &#39;\xF0\x9F...&#39; for column &#39;XXX&#39; at row 1
  6. STRUTS2 嵌套循环
  7. Magento控制器
  8. OpenStack official programs
  9. 关于Linux系统和Windows系统中文件夹的命名规范
  10. #291 div.2
  11. 【转】vim文件编码和乱码处理
  12. jquery的校验规则的方法
  13. PL/SQL 编程(一)基础,变量,分支,循环,异常
  14. selenium获取动态网页信息(某东)-具体配置信息
  15. IE浏览器右键菜单插件开发(上篇)——自定义一个IE右键菜单项
  16. python粗谈面向对象(二)
  17. Git使用之(pathspec master did not match any file(s) known to git)
  18. luogu4162 最长距离 (dijkstra)
  19. sudo: unable to execute ./script.sh: no such file or directory
  20. Docker源码分析(三):Docker Daemon启动

热门文章

  1. 优化脚本性能 Optimizing Script Performance
  2. ftp下出现“当前的安全设置不允许从该位置下载文件”提示
  3. Ansible实战之Nginx高可用代理LNMP-wordpress
  4. 【Luogu】P2468粟粟的书架(主席树+前缀和)
  5. JavaScript简明教程之Node.js
  6. linux文件属性详解及文件类型
  7. pat 团体天梯赛 L2-012. 关于堆的判断
  8. POJ1385 Lifting the Stone
  9. 移动WEB前端开发资源的一些素材
  10. .NET设计模式系列文章《转》