2017-02-10 5 views
1

У меня есть огромная проблема с временем загрузки для моего запроса. В этом случае мне нужны значения из столбца hg_ft_won (таблица: значения) для home_team_id и away_team_id (таблица: соответствует).Выберите значения из другой таблицы - слишком медленно

Это действительно так, как должно. Загрузка занимает очень много времени. Кто-нибудь есть идеи, как улучшить это, имея альтернативный запрос?

$sql = $conn->query("SELECT m.home_team_name, 
     m.away_team_name, 
     m.home_team_id, 
     m.away_team_id, 
     m.starting_time, 
     m.starting_date, 
     m.match_id, 
     m.season_id, 
     m.competition_id, 
     s.season_name, 
     s.country_name, 
     s.competition_name, 

    (SELECT hg_ft_won 
    FROM `values` v 
    WHERE m.home_team_id = v.team_id 
    AND m.season_id = v.season_id) AS hg_ft_won1, 

    (SELECT hg_ft_won 
    FROM `values` v 
    WHERE m.away_team_id = v.team_id 
    AND m.season_id = v.season_id) AS hg_ft_won2, 

FROM matches m, 
    seasons s 
WHERE m.season_id = s.id 
AND m.starting_date = '2017-02-11'"); 

табличные значения

values table

матчи таблица

matches table

Результаты от webpagetest.org performance test

+0

Вы можете начать с использования объединений вместо подзапросов, чтобы получить 'hg_ft_won1' и' hg_ft_won2'. Вы также должны проверить правильность индексирования таблиц. –

+0

Я пробовал INNER JOIN, но не смог заставить его работать. – vloryan

+0

Что не сработало? Ошибки? Неверный результат? Отправьте эту попытку. –

ответ

0

Никогда использовать запятые в предложении FROM. Всегда использовать надлежащим образом, явно JOIN синтаксис. Это, по существу, ваш запрос:

SELECT . . . 
     (SELECT hg_ft_won 
     FROM `values` v 
     WHERE m.home_team_id = v.team_id AND m.season_id = v.season_id 
    ) AS hg_ft_won1, 
     (SELECT hg_ft_won 
     FROM `values` v 
     WHERE m.away_team_id = v.team_id AND 
      m.season_id = v.season_id 
    ) AS hg_ft_won2, 
FROM matches m JOIN 
    seasons s 
    ON m.season_id = s.id LEFT JOIN 
    competition 
    ON competition.id = ?.competition_id 
WHERE m.starting_date = '2017-02-11'"); 

Для этого запроса вы хотите индексы:

  • matches(starting_date, season_id)
  • seasons(id) (вероятно, уже там)
  • competition(id) (вероятно, уже есть)
  • values(team_id, season_id, hg_ft_won)

Я не знаю, где competition_id есть. Он должен быть добавлен последним ключом к той таблице, к которой он принадлежит.

+0

Спасибо за помощь! Он работает, но он не намного быстрее, чем тот, который у меня есть. Таблица совпадений имеет около 2.000 строк и 20 столбцов, а таблица значений имеет 2.000 строк и 400 (да) столбцов. Может быть, это и есть причина? – vloryan

+0

@vloryan. , , Это не очень много данных. Сколько времени занимает запрос? –

+0

Загрузка занимает около 4 секунд. Я только что добавил результаты от webpagetest.org – vloryan

0

Попробуйте этот запрос. Создайте необходимый индекс, где это возможно.

 

    SELECT m.home_team_name, 
     m.away_team_name, 
     m.home_team_id, 
     m.away_team_id, 
     m.starting_time, 
     m.starting_date, 
     m.match_id, 
     m.season_id, 
     m.competition_id, 
     s.season_name, 
     s.country_name, 
     s.competition_name, 
     v1.hg_ft_won AS hg_ft_won1, 
     v2.hg_ft_won AS hg_ft_won2, 
    FROM matches m 
     INNER JOIN seasons s ON m.season_id = s.id 
     LEFT JOIN `values` v1 ON m.home_team_id = v1.team_id AND m.season_id = v1.season_id 
     LEFT JOIN `values` v2 ON m.home_team_id = v2.team_id AND m.season_id = v2.season_id 
    AND m.starting_date = '2017-02-11' 

Смежные вопросы