2017-02-10 29 views
1

我的查询的加载时间有一个很大的问题。在这种情况下,我需要home_team_idaway_team_id(表格:匹配)的列hg_ft_won(表格值:)。从另一个表中选择值 - 太慢

它确实工作,因为它应该。加载只需要很长时间。有没有人有想法如何通过具有替代查询来改善?

$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' 

相关问题