Laravel 提高 SQL 速度
Posted
技术标签:
【中文标题】Laravel 提高 SQL 速度【英文标题】:Laravel Increase SQL speed 【发布时间】:2018-10-12 17:10:32 【问题描述】:我正在尝试提高我在 Laravel 5.7 中的查询速度,我将调用时间缩短到了约 2.5 秒。我正在尝试找出更多方法来使其更快,如果我能得到一些帮助,我将不胜感激。
谢谢
我的数据结构:
功能(控制器):
public function getUserDataTmp(Request $request)
$input = file_get_contents("php://input");
$request = json_decode($input);
if ($this->authTokenAccess($request) == true)
$bottomWords = bottom_exterior_word::select('word','sentence','sequence','id','group_id')->where('user_id','=', $request->id)->get();
$emergencyWords = left_exterior_word::select('word','sentence','sequence','id')->where('user_id','=', $request->id)->get();
foreach($bottomWords as $tmp => $key)
$group_id = $key->group_id;
$bottomWords->user_id = $request->id;
$bottomWords[$tmp]->words = $key->getMainWords($group_id, $request->id);
foreach($emergencyWords as $key => $word)
$emergencyWords[$key]->image = imageModel::select('base64','id')->where('emergency_id','=', $word->id)->first();
$data = [
'data' => [
'return' => 'success',
'code' => 'VEDC001',
'response' => 'Successfully Gathered Words',
'main_categories' => $bottomWords,
'emergency_words' => $emergencyWords
]
];
return(json_encode($data));
getMainWords 函数(bottom_exterior_word 模型):
public function getMainWords($group_id, $id)
// return("TEST");
$words = \App\main_word::select('id','group_id','sentence','sequence','word')->where('group_id','=', $group_id)->where('user_id','=', $id)->get();
foreach ($words as $key => $word)
$words[$key]->image = Image::select('base64','id')->where('word_id','=', $word->id)->first();
return $words;
【问题讨论】:
你有索引吗? @Snapey 我有一个主键,主键会自动递增主词,所有内容都使用该键(word_id)。 @ImJT 我将从重构开始,以便在foreach
循环中不调用任何查询。
【参考方案1】:
从重构开始,这样您就不会在 foreach
循环中查询
foreach($bottomWords as $tmp => $key)
$group_id = $key->group_id;
$bottomWords->user_id = $request->id;
$bottomWords[$tmp]->words = $key->getMainWords($group_id, $request->id);
我会将getMainWords
函数更改为接受一组组ID 并使用whereIn
子句:
whereIn 方法验证是否包含给定列的值 在给定的数组内:
$users = DB::table('users') ->whereIn('id', [1, 2, 3]) ->get();
此循环的处理方式相同。
foreach($emergencyWords as $key => $word)
$emergencyWords[$key]->image = imageModel::select('base64','id')->where('emergency_id','=', $word->id)->first();
一般来说,尽量减少查询次数会缩短响应时间。
【讨论】:
【参考方案2】:旧帖子,不过想更新一下。自从我第一次发布这篇文章以来,我对 Laravel 有了更多的了解,并且对它更有经验。
这是我的新功能和解决方案:
控制器:
public function data(Request $request)
return response()->success(
[
'emergencywords' => EmergencyWord::with('image')->whereUserId($request->user()->id)->get(),
'categorywords' => CategoryWord::with(['image','words.image'])->whereUserId($request->user()->id)->get(),
]
);
分类词关系:
public function image()
return $this->hasOne('App\Image','id','image_id');
public function words()
return $this->hasMany('App\MainWord','category_words_id','sequence');
紧急词关系:
public function image()
return $this->hasOne('App\Image','id','image_id');
主词关系:
public function image()
return $this->hasOne('App\Image','id','image_id');
【讨论】:
以上是关于Laravel 提高 SQL 速度的主要内容,如果未能解决你的问题,请参考以下文章