Проблемы с производительностью при фильтрации по связи в запросе Laravel (whereHas со статусом)Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Проблемы с производительностью при фильтрации по связи в запросе Laravel (whereHas со статусом)

Сообщение Anonymous »

Я работаю над оптимизацией запроса в Laravel, но у меня проблемы с производительностью на сервере (хотя локально он работает нормально). Запрос фильтрует модель Person по статусу последнего посещения, используя связь с моделью VisitData. В частности, я фильтрую на основе поля visit_status_id, которое берется из таблицы opt_visit_statuses (где идентификаторы статуса — 1, 2, 3 и 4).
Соответствующие модели :
Модель Person
Модель Person имеет связь lastVisit. , который извлекает данные о последнем посещении данного человека:

Код: Выделить всё

public function lastVisit()
{
return $this->hasOne(VisitData::class)->latest('visit_date');
}
Модель VisitData
Модель VisitData хранит информацию о посещениях, включая visit_status_id:

Код: Выделить всё

class VisitData extends Model implements Auditable
{
use \OwenIt\Auditing\Auditable;
use HasFactory;

protected $fillable = [
'visit_id',
'person_id',
'visit_status_id',
'refuse_reason_id',
'comment',
'visit_date'
];

public function visit(){
return $this->belongsTo(Visit::class);
}

public function person(){
return $this->hasOne(Person::class, 'id', 'person_id');
}

public function visitStatus(){
return $this->hasOne(VisitStatus::class, 'id', 'visit_status_id');
}
}
**Текущий запрос
**
В методе index моего контроллера я фильтрую людей по нескольким критериям, включая visit_status_id< /strong> последнего посещения:

Код: Выделить всё

$persons = Person::with('vulnerabilityGroup', 'gender', 'documentType', 'citizenship', 'family', 'lastVisit.visit', 'lastVisit.visitStatus')
->withCount('documents', 'verifiedMember')
**    ->when($visitStatus, function ($query) use ($visitStatus) {
return $query->whereHas('lastVisit', function ($q) use ($visitStatus) {
$q->where('visit_status_id', $visitStatus);
});
})**
->paginate(30);
Проблема[/b]

Код: Выделить всё

•Performance: This query works fine on my local environment but is slow when running on the server.
•Filtering by Status: $visitStatus comes from the opt_visit_statuses table and represents the id field. There are four possible IDs (1, 2, 3, 4). I’m concerned that this filtering might be causing the slowdown.
**Вопрос:
**
Что еще я могу сделать, чтобы улучшить производительность этого запроса на сервере? Что-то не так с тем, как я фильтрую данные по visit_status_id с помощьюwhereHas? Можно ли дополнительно оптимизировать то, как я веду отношения?
Дополнительная информация

Код: Выделить всё

•.I’m using Laravel 8.
•.The database engine is MySQL.
•.The visit_status_id is indexed, and I’ve confirmed the IDs (1, 2, 3, 4) exist and are correct.
Будем очень признательны за любые советы по оптимизации этого запроса!
Шаги, которые я предпринял
  • Индексация: я добавил индекс в столбец visit_status_id в таблице visit_data.
  • Оптимизированное взаимодействие: я скорректировал метод LastVisit, чтобы вместо него использовать последний('visit_date') ofMany(), чтобы убедиться, что я получаю последнее посещение.
    3.Проверено на наличие значений NULL: я проверил, что поле visit_status_id не содержит неожиданных значений NULL.
    4.Желаю загрузки: я нетерпеливо загружает связь LastVisit, чтобы уменьшить количество запросов.


Подробнее здесь: https://stackoverflow.com/questions/790 ... erehas-wit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»