Как улучшить запрос

у меня 3 стола

A1: name, id
A2: a_id, b_id (can be more than one a_id => b_id)
B1: id, *

Я использую подзапрос с leftJoin на A2 с A1, но работа очень медленная (выбирает 10 с) В B1 я извлекаю данные, и мне нужно разбивать B1 на уникальные экземпляры A2 и фильтровать по полям. Без этого запроса B1 получает менее 0,5 с.

Я нашел решение установить OPTION (FORCE ORDER), но это вызывает ошибку в запросе laravel;

я использую

     $query = $query->toSql();
      $data = DB::select(DB::raw($query . " OPTION (FORCE ORDER)"));
      // fetch data

      $this->startCondition()
        ->leftJoinSub($data, 'query_data', function ($join) {
          $join->on('query_data.lead_id', '=', 'table.id');
      });

Синтаксическая ошибка или нарушение доступа: 1064 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «OPTION\t (FORCE ORDER)» в строке 1

Я улучшил запрос, добавив индекс по двум столбцам (a_id, b_id, created_at), но этого недостаточно. Он получает на 25% больше скорости запросов, теперь я потерял 7,5 секунды, чтобы получить 25 строк из таблицы

create index A2_index_o on A2(a_id, b_id, created_at); 

Пожалуйста, поделитесь более подробной информацией, например сгенерированным запросом, и вашими попытками решить проблему.

Nico Haase 26.05.2023 14:27
stackoverflow.com/questions/3456134/…
Your Common Sense 26.05.2023 14:36
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я получил первую простую разбивку на страницы для текущей страницы, например a1=>a2, получил идентификаторы для текущего смещения и поместил их в подзапрос;

 $this->prepared = array_map(fn($item) => $item->id, $prepare->items());


 $subquery->whereIn('lead_id', $this->prepared)

Это сэкономило мне еще 5 секунд. Также я добавил дополнительную фильтрацию, если для сортировки использовался порядок, но это не улучшило скорость.

Основная часть моей проблемы была решена, когда запрос выполнялся быстрее.

Теперь запрос к БД выглядит так

    A1 data | null | null
 * current offset *
    A1 data | A2 data | B1 data
 * end of current offset *
    A1 data | null | null

Другие вопросы по теме