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