我在Laravel中查询有很多记录的问题,因为它太慢了。
我的表用户有 4934 记录。
我有关系表,例如名为 user_relation_values 的 17482 记录。
我的表值有 20495 记录。
现在我从前端收到用户的 N ID,因此我可以收到1个ID或4934个ID或2000个ID或1000个ID,因此我不知道有多少个ID我会收到的。
我必须从收到的ids开始,返回模型用户与id的关系。
所以在我的后端我有这样的功能:
$users= $request->input('users');
$usersValues = array();
foreach ($users as $user){
$o = User::find($owner['id']);
$o->values;
$owersProperties[] = $o;
}
我在“我的用户”模型中有关系:
public function values(){
return $this->belongsToMany('App\Models\Values');
}
我已将各种索引放在表上,但如果收到所有ID,则查询速度太慢。
如果我收到所有4934个ID,则查询时间超过20秒,但我读到有人在5秒钟内查询了数百万条记录。
如何优化我的表格或查询?
答案 0 :(得分:0)
查看示例代码,您将循环查询用户( n 查询),然后也查询每个用户的值。这将发出指数数量的查询。相反,您应该查询用户并急切加载值关系。
如果您将一组用户ID作为输入,那么您可以将其传递给Eloquent的find()
方法:
$users = User::find($request->input('users'));
如果你计划在循环中使用它,你也应该急切加载values
关系:
$users = User::with('values')->find($request->input('users'));
这可以大大减少您发出的查询数量。