php 優化查詢 foreach

php代碼優化

應避免在php foreach裏面進行sql查詢
以下代碼示例使用了laravel的操作數據庫api,eloquent orm

foreach裏面執行兩次sql查詢

// $datas 要返回的數據
foreach ($datas as $_v) {
    // todo 在foreach中查詢了兩次 **time**: 290 ms(postman)
    $uid = $_v->uid;
    $_v->user_name   = User::find($uid)->username; // 1
    $_v->user_avatar = User::find($uid)->avatar;   // 2
}

foreach裏面執行一次sql查詢

foreach ($datas as $_v) {
    // todo
    // 簡單的優化使得兩次sql查詢變成一次
    // 在foreach中查詢了一次 **time**: 230 ms(postman)
    $user = User::find($_v->uid));     // 1
    $_v->user_name   = $user->username;
    $_v->user_avatar = $user->avatar;
}

將sql查詢移到foreach外面

上面兩個方法都不可避免的在foreach裏面執行了數據庫查詢
**應避免在foreach中執行sql查詢**
此處我的做法是再加一層foreach+if來代替sql查詢
// 本質上是將foreach中的查詢移到外面
// $tmp_data_arr 是存儲在foreach外面執行的數據庫查詢結果
foreach ($tmp_data_arr as $value) {
    foreach ($datas as $_v) {
        if ($_v->uid === $value['id']) { // **time**: 180 ms(postman)
            $_v->user_name   = $value['username'];
            $_v->user_avatar = $value['avatar'];
        }
    }
}

小結

// 返回數據
return $datas;
經過簡單的優化:時間(ms):290 -> 230 -> 180

ps

postman是一款很好用的chrome調試restful api的插件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章