Laravel eloquent 100000 条记录查询速度慢
Laravel eloquent query slow with 100000 records
我有这个简单的 eloquent 查询,工作正常,但记录很少。
当数据库递增到 100000 条记录时变得非常慢。
我读到应该使用 chunk 而不是 get。我如何为这个查询实现它?
$collection = Contact::with('shop');
$collection = $collection->orderBy('created_at', 'DESC');
$collection = $collection->get();
$json = $collection->map(function ($contact) {
return [
'id' => $contact->id,
'name' => $contact->name,
...about 50 columns more.
'shop' => [
'id' => optional($contact->shop)->id,
'name' => optional($contact->shop)>name
],
...about 6 relations more.
];
});
$json = $json->paginate(50);
return response()->json(['contacts' => $json], 200);
您正在转换获取所有数据,如 1M 或它有多少条记录。然后你映射它并对其进行分页并且只得到 50。你的代码存在巨大的性能问题。
你可以这样直接调用:
return response()->json(['contacts' => Contact::with('shop')->orderBy('created_at', 'DESC')->paginate(50)], 200);
如果您只需要联系人的 ID 和姓名:
return response()->json(['contacts' => Contact::select('id', 'name', 'created_at')->orderBy('created_at', 'DESC')->paginate(50)], 200);
我有这个简单的 eloquent 查询,工作正常,但记录很少。
当数据库递增到 100000 条记录时变得非常慢。
我读到应该使用 chunk 而不是 get。我如何为这个查询实现它?
$collection = Contact::with('shop');
$collection = $collection->orderBy('created_at', 'DESC');
$collection = $collection->get();
$json = $collection->map(function ($contact) {
return [
'id' => $contact->id,
'name' => $contact->name,
...about 50 columns more.
'shop' => [
'id' => optional($contact->shop)->id,
'name' => optional($contact->shop)>name
],
...about 6 relations more.
];
});
$json = $json->paginate(50);
return response()->json(['contacts' => $json], 200);
您正在转换获取所有数据,如 1M 或它有多少条记录。然后你映射它并对其进行分页并且只得到 50。你的代码存在巨大的性能问题。
你可以这样直接调用:
return response()->json(['contacts' => Contact::with('shop')->orderBy('created_at', 'DESC')->paginate(50)], 200);
如果您只需要联系人的 ID 和姓名:
return response()->json(['contacts' => Contact::select('id', 'name', 'created_at')->orderBy('created_at', 'DESC')->paginate(50)], 200);