无法从大型表行检索记录

cbwuti44  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(379)

我正在使用laravel框架。在我的数据库记录表中有超过400000行。现在我想使用一些条件逻辑检索记录:需要匹配服务id需要匹配状态
但我的应用程序无法检索数据(无法处理此请求)。我在用这个查询

  1. foreach ($ven as $ven){
  2. $data = $ven->data;
  3. $record = $data ->records()->where('status','success')->get();
  4. }

我的状态列已添加到索引中。
需要建议吗

hujrc8aj

hujrc8aj1#

尝试访问循环中相关记录的方式可能会产生n+1问题
根据官方文件,当作为属性访问有说服力的关系时,关系数据是“延迟加载的”。这意味着在您首次访问属性之前,关系数据不会被实际加载。但是,雄辩者可以在查询父模型时“急切地加载”关系。急于加载减轻了n+1查询问题
您可以将相关数据作为

  1. $results = ParentModel::with('records')
  2. ->where(...) /* If there are any filters for ParentModel */
  3. ->get();

对于快速加载,只会执行2个查询来获取主模型和相关模型的数据。中的每一行 $results 将创建一个相关记录的集合,您可以迭代该集合以列出每个相关对象的详细信息。
要获得相关模型的筛选行,可以修改 with() 方法as

  1. $results = ParentModel::with(['records' => function ($query) {
  2. $query->where('status','=','success');
  3. }])
  4. ->where(...) /* If there are any filters for ParentModel */
  5. ->get();

根据可以使用的相关记录获取parentmodel的筛选行 whereHas ```
$results = ParentModel::with('records')
->where(...) /* If there are any filters for ParentModel */
->whereHas('records', function ($query) {
$query->where('status','=','success');
})->get();

展开查看全部
ddarikpa

ddarikpa2#

首先,您需要将状态保持为int形式,而不是字符串形式。它将帮助您轻松地筛选记录。
使用 chunk 用于处理大型数据集。我想是吧 $ven 是为了场地。所以,遵循下面的代码。

  1. DB::table('venues')
  2. ->select('venues.*', 'records.*')
  3. ->join('records', 'venues.id', '=', 'records.venue_id')
  4. ->orderBy('id')->chunk(1000, function($venues) {
  5. foreach ($venues as $venue) {
  6. // your logic
  7. }
  8. });

注意:我使用了查询生成器而不是雄辩。这是因为查询生成器比雄辩更快。

相关问题