有時候這樣的效率還可以,但是隻要牽涉到運算元據庫,那就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出來結果。