无法从大型表行检索记录

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

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

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

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

hujrc8aj

hujrc8aj1#

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

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

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

$results = ParentModel::with(['records' => function ($query) {
                            $query->where('status','=','success');
                        }])
                        ->where(...) /* If there are any filters for ParentModel */
                        ->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 是为了场地。所以,遵循下面的代码。

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

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

相关问题