Оптимизация запросов mysql?

Имеются следующие таблицы:
matches: id, start_time, tournament_id
teams: id, name, logo
matches_teams: id, match_id, team_id
tournaments: id, name

Сейчас полную инфу о матчах получаю следующим образом:
1. Одним запросом получаю matches.id, matches.start_time, tournaments.name
2. Далее циклом для каждого матча из п1 делаю еще два запроса - для первой команды и для второй.

В итоге получаю примерно такой массив:
match_id
match_start_time
tournament_name
team_A_name
team_A_logo
team_B_name
team_B_logo

И получается, что для получения 20 матчей делается 60 запросов (для получения инфы для одной лишь страницы).
Исходя из этого есть несколько вопросов
1. как можно оптимизировать запросы?
2. что лучше, несколько простых запросов или один сложный?
3. можно ли средствами mysql получать вложенные массивы? чтобы не было $result['team_A_name'], $result['team_A_logo'], а было $result['team_A']['name'], $result['team_A']['logo'] (php). Сейчас делаю это с помощью php, "конфигурируя" новый массив с вложенной структурой
  • Вопрос задан
  • 1173 просмотра
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
1) как уже указал вам Кирилл Несмеянов - читайте про джоин, ин и вложенные запросы, задача как раз классическая на джоин и ин.
2) Абсолютно верно замечено John Didact - из бд вы ВСЕГДА получаете "плоские" данные, однако вы можете для себя их разделить префиксами в алиасах и обработать на стороне кода как удобно.
3) Большой запрос с множеством джоинов почти всегда лучше нескольких маленьких. Исключение - большие массивы текстовых/блоб полей, но и это обычно не критично, если выставить адекватные лимиты. Как минимум, преимущество в возможности удобного кеширования. Плюс время на открытие/закрытие соединения, плюс не надо гонять туда-сюда полученные данные несколько раз.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы