Php 从另一个表中选择值-速度太慢
我的查询加载时间有一个很大的问题。在这种情况下,我需要主队id和客队id(表:比赛)的hg\u ft\u won(表:值)列中的值 它确实发挥了应有的作用。加载只需要很长时间。有没有人知道如何通过另一个查询来改进这一点Php 从另一个表中选择值-速度太慢,php,mysql,Php,Mysql,我的查询加载时间有一个很大的问题。在这种情况下,我需要主队id和客队id(表:比赛)的hg\u ft\u won(表:值)列中的值 它确实发挥了应有的作用。加载只需要很长时间。有没有人知道如何通过另一个查询来改进这一点 $sql = $conn->query("SELECT m.home_team_name, m.away_team_name, m.home_team_id, m.away_team_id, m.startin
$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'");
值表
火柴桌
来自webgetest.org的结果
切勿在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'");
对于此查询,您需要索引:
匹配(开始日期、季节id)
(可能已经有了)季节(id)
(可能已经有了)竞赛(id)
价值观(球队id、赛季id、hg\u ft\u won)
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'");
对于此查询,您需要索引:
匹配(开始日期、季节id)
(可能已经有了)季节(id)
(可能已经有了)竞赛(id)
价值观(球队id、赛季id、hg\u ft\u won)
我不知道比赛id在哪里。应该将它添加到它所属的表的最后一个键处。尝试此查询。尽可能创建所需的索引 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' 选择m.home\u团队名称, m、 客场球队的名字, m、 主队id, m、 客队, m、 开始时间, m、 开始日期, m、 匹配id, m、 第二季, m、 竞赛id, s、 你的名字, s、 国名, s、 比赛名称, v1.hg_ft_won作为hg_ft_won 1, v2.hg_ft_won作为hg_ft_won 2, 从m 在m.seasure\u id=s.id上的内部连接seasures s 左键在m.home\u team\u id=v1.team\u id和m.seasure\u id=v1.seasure\u id上加入'values`v1 左键在m.home\u team\u id=v2.team\u id和m.seasure\u id=v2.seasure\u id上加入'values`v2 m.起始日期='2017-02-11'
请尝试此查询。尽可能创建所需的索引 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' 选择m.home\u团队名称, m、 客场球队的名字, m、 主队id, m、 客队, m、 开始时间, m、 开始日期, m、 匹配id, m、 第二季, m、 竞赛id, s、 你的名字, s、 国名, s、 比赛名称, v1.hg_ft_won作为hg_ft_won 1, v2.hg_ft_won作为hg_ft_won 2, 从m 在m.seasure\u id=s.id上的内部连接seasures s 左键在m.home\u team\u id=v1.team\u id和m.seasure\u id=v1.seasure\u id上加入'values`v1 左键在m.home\u team\u id=v2.team\u id和m.seasure\u id=v2.seasure\u id上加入'values`v2 m.起始日期='2017-02-11'
您可以首先使用联接而不是子查询来获取
hg_ft_won1
和hg_ft_won2
。您还应该检查您的表是否已正确索引。我已尝试内部联接,但无法使其工作。什么不工作?错误?错误的结果?你可以先使用连接而不是子查询来获取hg_ft_won1
和hg_ft_won2
。您还应该检查您的表是否已正确索引。我已尝试内部联接,但无法使其工作。什么不工作?错误?错误的结果?也请发布该尝试。谢谢您的帮助!它能工作,但它并不比我得到的快多少。matches表有大约2000行和20列,values表有2000行和400(是)列。这可能是原因吗?@vloryan。这不是很多数据。查询需要多长时间?加载大约需要4秒。我刚刚添加了WebGetTest的结果。org@vloryan . . . 您确定瓶颈是查询而不是屏幕上的图形吗?如果您直接将数据放入一个表中,并将其用于计时测试,会发生什么?我在页面上没有一个图像或任何其他内容。这一个查询就是测试页面上的全部内容。感谢您的帮助!它能工作,但它并不比我得到的快多少。matches表有大约2000行和20列,values表有2000行和400(是)列。这可能是原因吗?@vloryan。这不是很多数据。查询需要多长时间?加载大约需要4秒。我刚刚添加了WebGetTest的结果。org@vloryan . . . 您确定瓶颈是查询而不是屏幕上的图形吗?如果您直接将数据放入一个表中,并将其用于计时测试,会发生什么?我在页面上没有一个图像或任何其他内容。这一个查询就是测试页面上的全部内容。