творю онлайн каталог, этот каталог содержит бизнес, это то, как текущая структура таблицы указана:Laravel/MYSQL (Красноречивый) - Запрос большого стола
1) «Бизнес»
- ID (ПК)
- Имя
- phone_number
- Электронная почта
2) Метки
- идентификатор (ПК)
- тег
3) Business_tags
- ID (ПК)
- business_id (ФК)
- tag_id (FK)
В таблице бизнес-таблицы находится более 9 тыс. Строк и более 84 269 строк, а в таблице («Бизнес-таблицы») содержится более 29 тыс. Строк (поскольку бизнес может иметь несколько тегов).
Внутри бизнес-модели, заключается в следующем:
public function tags()
{
return $this->belongsToMany('App\Tags');
}
Вопрос в том, когда я пытаюсь сделать поиск, поэтому, например, допустим, что кто-то хочет найти для «китайцев», то это занимает больше времени, чем, вероятно, должно возвращать значение. Например, я использую:
$business = Business::where(function ($business) use ($request) {
$business->whereHas('tags', function ($tag) use ($request) {
});
})->paginate(20);
Поиск в среднем занимает 35 секунд для отображения результатов.
Вот исходный SQL:
select * from `businesses` where (exists (select * from `tags` inner join `business_tags` on `tags`.`id` = `business_tags`.`tags_id` where `business_tags`.`business_id` = `businesses`.`id` and `name` in ('chinese')))
Это занимает в среднем: 52.4s для запуска внутри Sequel Pro (используя необработанный заявление SQL)
Любые идеи, как я могу улучшить производительность этого запрос, чтобы он был намного быстрее? Я хочу иметь эту функциональность, но пользователь не будет долго ждать ответа!
EDIT:
1 PRIMARY businesses NULL ALL NULL NULL NULL NULL 8373 100.00 Using where
2 DEPENDENT SUBQUERY business_tags NULL ALL NULL NULL NULL NULL 30312 10.00 Using where
2 DEPENDENT SUBQUERY tags NULL eq_ref PRIMARY PRIMARY 4 halalhands.business_tags.tags_id 1 10.00 Using where
Вы можете использовать 'chunk', это ускорит ваш запрос –
Какие индексы вы указали? –
@PaulSpiegel У меня есть индекс. Я установил внешние ключи для каждой таблицы – Phorce