优化大数据集两个表之间匹配记录的查询性能

问题描述 投票:0回答:1

我有一个 Laravel 应用程序,我从两个表中检索数据:LoginDataLocationStatusLoginData 表包含具有单个 IMEI 的记录,而 LocationStatus 表包含每个 IMEI 的多个记录,并带有指示记录创建时间的 serverDatetime 时间戳。

这是我的代码的简化版本:

$offline_mhes = LoginData::select('loginData.id','imei','speed','ignition','loginData.batteryVoltage as batteryCurrent', 'loginData.extVoltage as extVoltageSupply','loginData.latitude','loginData.longitude','loginData.updated_at','batteryCurrent','GNSSStatus','bus.bus_name as object_name','loginData.integrate')
    ->join('bus', 'loginData.imei', '=', 'bus.imei_number')
    ->where('loginData.integrate','=','1')
    ->whereNotNull('imei')
    ->whereNotIn('imei',$active_mhes_past_hour)
    ->get();

foreach ($offline_mhes as $offline_mhe) {
    $latest_location = LocationStatus::where('imei',$offline_mhe->imei)
        ->orderByDesc('serverDatetime')
        ->first();
    // issue is here....
}

但是,LocationStatus 表包含大约 400 万条 记录,检索每个 IMEI 的最新记录的查询执行需要近 1 分钟,从而影响性能。

我正在寻找有关如何优化此查询以提高性能的建议。我已经考虑过对 LocationStatus 表中的 imei 列建立索引,但我愿意接受其他策略或最佳实践来加速此操作。

mysql laravel query-optimization
1个回答
0
投票

也许您需要使用子查询来发送每个查询以获取 LocationStatus。 看看 Laravel 文档的这一部分(链接),也许你会找到你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.