У меня есть запрос, выполняющийся в задании Laravel, который выполняется очень медленно и непоследовательно. Иногда получение результата занимает 1–2 минуты, а иногда для того же самого запроса требуется всего 1–2 секунды.
Медленный полный красноречивый запрос (Выполнение запроса занимает 1–2 минуты)
Код: Выделить всё
$relevantRobot = App\Robot::where('serial_number', 'TEST-ID')
->whereHas('robot_maps', function($query) use ($robot_map_name) {
$query->where('name', $robot_map_name);
})
->with(['robot_maps' => function($query) use ($robot_map_name) {
$query->where('name', $robot_map_name);
},
'current_robot_position',
'current_robot_position.robot_map',
'latest_robot_deployment_information_request'
])
->first(); // Get the raw SQL query
Код: Выделить всё
$relevantRobot = App\Robot::where('serial_number', 'TEST-ID')
->whereHas('robot_maps', function($query) use ($robot_map_name) {
$query->where('name', $robot_map_name);
})
->with(
'current_robot_position',
])
->first(); // Get the raw SQL query
Код: Выделить всё
$relevantRobot = App\Robot::where('serial_number', 'TEST-ID')
->whereHas('robot_maps', function($query) use ($robot_map_name) {
$query->where('name', $robot_map_name);
})
->with(
'latest_robot_deployment_information_request',
])
->first(); // Get the raw SQL query
Код: Выделить всё
select * from `robots` where `serial_number` = 'TEST-ID' and exists (select * from `robot_maps` where `robots`.`id` = `robot_maps`.`robot_id` and `name` = 'test' and `active` = 1);
Код: Выделить всё
public function current_robot_position(){
return $this->hasOne('App\RobotMapPositionLog','robot_id','id')
->orderBy('id','desc');
}
Заметив медленную загрузку при активной загрузке current_robot_position, я добавлены индексы к столбцам, используемым в этом отношении (id). Однако это не улучшило производительность.
Я также попробовал преобразовать запрос Eloquent в необработанный запрос MySQL с помощью toSql(), и он работал очень быстро (менее 1 секунды).< /p>
Что не так? Чего мне не хватает?
ОБНОВЛЕНИЕ
Я определил ->with('current_robot_position') как проблему, которая медленно распространяется по всему запросу.
Как предлагали некоторые другие, я создал внешний ключ столбец (robot_id) столбец, используемый в отношении столбца индекса, а также измененный orderBy с помощью late(), но ни то, ни другое не помогло значительно сократить время загрузки
Подробнее здесь: https://stackoverflow.com/questions/791 ... ounterpart