красноречивый, где проблема с производительностью

#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 or artist_track . Etc.