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