優化基於以下幾個原則:
1、盡量以小結果集驅動大結果集(和mysql中join類似);
2、盡量少在循環中執行sql操作,如果一定要執行sql,盡量批量執行;
3、盡量減少邏輯性代碼和調用外部方法,如必要,盡量在在小結果集上處理的;
4、實際應用中發現循環嵌套使用的數據大部分一樣,只有小部分不同,果斷提取,外部處理;
場景1:
1 <?php 2 3 $data = array(); 4 //參數 5 6 $kid = []; //數組長度大於300 7 $dataarray = []; //數組長度大於50 8 9 foreach ($dataarray as $k=>$v){ 10 11 $starttime = 0; 12 $endtime = 0; 13 $timearr[$starttime.$endtime]['rid'][] = $k; 14 $data = array(); 15 $i=0; 16 foreach ($kid as $kk){ 17 18 $data[$i]['k'] = $kk; 19 $data[$i]['m'] = $kk; 20 $data[$i]['n'] = $kk; 21 //必要的賦值操作 22 //... 23 24 //各種邏輯判斷,並且賦值使用的是上一級嵌套中的變量 25 if (!empty($v['a'])) 26 $data[$i]['a'] = $v['a']; 27 if (!empty($v['a'])) 28 $data[$i]['a'] = $v['a'].",".$v['a']; 29 30 if (!empty($v['a'])) 31 $data[$i]['a'] = $v['a']; 32 if (!empty($v['a'])) 33 $data[$i]['a'] = $v['a'].",".$v['a']; 34 35 if (!empty($v['a'])) 36 $data[$i]['a'] = $v['a']; 37 if (!empty($v['a'])) 38 $data[$i]['a'] = $v['a'].",".$v['a']; 39 $i++; 40 } 41 //插入數據 42 $allin = $this->model->table('pp')->addALL($data); 43 } 44 exit;
以上代碼實際使用中執行時長大概 20s
優化后如下,把必要的邏輯操作,又涉及到上一層循環變量,提取出來,不要放在大結果集中處理,執行時長大概 3秒
<?php
//參數
$kid = [];
$dataarray = [];
foreach ($dataarray as $k=>$v){
if (!empty($v['a']))
$a = $v['a'];
if (!empty($v['a']))
$a = $v['a'].",".$v['a'];
if (!empty($v['a']))
$a = $v['a'];
if (!empty($v['a']))
$a = $v['a'].",".$v['a'];
if (!empty($v['a']))
$a = $v['a'];
if (!empty($v['a']))
$a = $v['a'].",".$v['a'];
$data = [];
foreach ($kid as $mm=>$kk){
$data[$mm]['k'] = $kk;
$data[$mm]['m'] = $kk;
$data[$mm]['n'] = $kk;
//必要的賦值操作
//...
$data[$mm]['a'] = $a;
$data[$mm]['a'] = $a;
$data[$mm]['a'] = $a;
$data[$mm]['a'] = $a;
}
//插入數據
$allin = $this->model->table('pp')->addALL($data);
}
exit;
場景2:
優化前,執行時間80秒,其中循環時間 62,數據庫操作時間 18秒
1 <?php 2 3 4 //參數 5 6 $kid = [];//長度大於300 7 8 9 10 $dataarray = []; //長度大於50 11 $stimearr = []; 12 $etimearr = []; 13 14 $countTime = count($stimearr); //長度大於 5 15 16 for ($a = 0;$a < $countTime;$a++) { //注意,后面兩層嵌套中,除了時間不一樣,其他完全一樣 17 18 $stime = strtotime($stimearr[$a]); 19 $etime = strtotime($etimearr[$a]); 20 21 22 foreach ($kid as $kk) { // 大結果集 23 $data = array(); 24 $i = 0; 25 foreach ($dataarray as $k => $v) { //小結果集合 26 27 $data[$i]['a'] = $kk; 28 $data[$i]['a'] = intval($k); 29 $data[$i]['a'] = $v['a']; 30 $data[$i]['a'] = $v['a']; 31 $data[$i]['stime'] = $stime; 32 $data[$i]['etime'] = $etime; 33 34 if ($a) { 35 $data[$i]['a'] = $k; 36 $data[$i]['a'] = $k; 37 } 38 if ($a) { 39 $data[$i]['a'] = $k; 40 $data[$i]['a'] = $k; 41 } 42 $i++; 43 } 44 //插入數據 45 $allin = $this->model->table('pp')->addAll($data); 46 } 47 } 48 exit;
優化后
<?php
//參數
$kid = [];//長度大於300
$dataarray = []; //長度大於50
$stimearr = [];
$etimearr = [];
$countTime = count($stimearr); //長度大於 5
$i = 0;
$data = [];
//提取數據保存
foreach ($dataarray as $k=>$v){ //小結果集
$a = 'xxx'; //邏輯處理
$a = 'xxx'; //邏輯處理
$a = 'xxx'; //邏輯處理
$a = 'xxx'; //邏輯處理
foreach ($kid as $mm=>$kk){ //大結果集合
$data[$i][$mm]['a'] = $kk;
$data[$i][$mm]['a'] = intval($k);
$data[$i][$mm]['a'] = $v['a'];
$data[$i][$mm]['a'] = $v['a'];
$data[$i][$mm]['a'] = $a;
$data[$i][$mm]['a'] = $a;
$data[$i][$mm]['a'] = $a;
}
$i ++;
}
for ($b = 0;$b < $countTime;$a++) {
$stime = strtotime($stimearr[$b]);
$etime = strtotime($etimearr[$b]);
foreach ($data as $k=>$v){
foreach ($v as $kk=>$vv){
$data[$k][$kk] = array_merge($data[$k][$kk],['starttime'=>$stime,'endtime'=>$etime]);
}
//插入數據
$allin = $this->model->table('pp')->addALL($data[$k]);
}
}
