我有一个 Laravel 应用程序,我从两个表中检索数据:LoginData 和 LocationStatus。 LoginData 表包含具有单个 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 列建立索引,但我愿意接受其他策略或最佳实践来加速此操作。
也许您需要使用子查询来发送每个查询以获取 LocationStatus。 看看 Laravel 文档的这一部分(链接),也许你会找到你想要的。