у меня 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);






Я получил первую простую разбивку на страницы для текущей страницы, например 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
Пожалуйста, поделитесь более подробной информацией, например сгенерированным запросом, и вашими попытками решить проблему.