#mysql #laravel #eloquent #query-performance
#mysql #laravel #красноречивый #запрос-производительность
Вопрос:
Я использую eloquent where имеет отношение к 3 глобальным областям, и эти области вызывают значительное снижение производительности
обработка этого запроса на сервере занимает около 140 секунд!!
это globalScopes
protected static function boot()
{
parent::boot();
if ( !auth('admin')->check() ) {
static::addGlobalScope(new DoesntHaveForbiddenArtistScope());
static::addGlobalScope('has-artist', function (Builder $builder) {
$builder->whereHas('artists');
});
static::addGlobalScope('has-mp3', function (Builder $builder) {
$builder->whereHas('mp3s');
});
}
}
и это запрос count, который я видел в telescope
from `tracks`
where exists(
select *
from `artists`
inner join `artist_track`
on `artists`.`id` =
`artist_track`.`artist_id`
where `tracks`.`id` = `artist_track`.`track_id`
and `published` = 1
and `forbidden` = 0
)
and `published` = 1
and not exists(
select *
from `artists`
inner join `artist_track`
on `artists`.`id` =
`artist_track`.`artist_id`
where `tracks`.`id` = `artist_track`.`track_id`
and `forbidden` = 1
)
and exists(
select *
from `artists`
inner join `artist_track`
on `artists`.`id` =
`artist_track`.`artist_id`
where `tracks`.`id` = `artist_track`.`track_id`
and `published` = 1
and `forbidden` = 0
)
and exists(
select *
from `track_mp3s`
where `tracks`.`id` = `track_mp3s`.`track_id`
and `downloaded` = 1
)
есть ли что-нибудь, чтобы улучшить запрос eloquent, который я написал, чтобы ускорить процесс?
В настоящее время я использую индексы MySQL, которые немного помогли, но 140 секунд слишком много
Комментарии:
1. Пожалуйста, укажите
SHOW CREATE TABLE
для каждой таблицы.2. Когда
JOINing
таблицы, пожалуйста, укажите каждый столбец, чтобы мы могли легко видеть, в какой таблице каждый находится. Для помощи с производительностью жизненно важно, чтобы мы знали, находится лиforbidden
вartists
orartist_track
. Etc.