Я пытаюсь оптимизировать мой MYSQL запрос. У меня есть только 2 тыс. Строк в базе данных, однако запрос как таковой занимает почти 1,5-2 секунды. Из-за других запросов, выполняемых в приложении Laravel, средняя загрузка страницы с этим запросом занимает слишком много времени для хорошего взаимодействия с пользователем.
Когда я удаляю заказ на, запрос занимает всего 0,03 секунды.
select *
from `companies`
left join `model_has_status` on `companies`.`id` = `model_has_status`.`company_id`
left join `statuses` on `model_has_status`.`status_id` = `statuses`.`id`
where `model_has_status`.`status_id` = (select `status_id`
from `model_has_status`
where `company_id` = `companies`.`id`
order by `created_at` desc
limit 1)
and `companies`.`deleted_at` is null
order by companies.`active_name` asc
limit 30 offset 0
Mysql объяснение имеет следующий вывод:
Я попытался добавить индекс companies.active_name. Однако это было безрезультатно. Кто может дать мне указатель, что оптимизировать?
Для завершения это запрос Laravel, который я выполняю из приложения:
$companies = QueryBuilder::for(Company::class)
->leftjoin('model_has_status', 'companies.id', 'model_has_status.company_id')
->leftjoin('statuses', 'model_has_status.status_id', 'statuses.id')
->allowedFilters([
AllowedFilter::custom('status', new FilterCompanyStatus()),
])
->where('model_has_status.status_id', function ($query) {
$query->select('status_id')
->from('model_has_status')
->whereColumn('company_id', 'companies.id')
->orderByDesc('created_at')
->limit(1);
})
->defaultSort('active_name')
->paginate(30);