问题描述
我有下面的查询,我很欣赏它的编写方式,但我不满意,但是在装有Xampp和MariaDB的本地PC上,它的执行时间为0.1719秒,大约是我希望的速度。
但是,在具有Plesk和MariaDB的开发服务器上,具有相同数据的相同查询需要12秒钟以上。显然没有用。
可能可以修改查询以使其更好,但是有人可以解释为什么性能差异吗?该服务器是VPS,不存在资源短缺-它不处于活动状态,因此使用率几乎没有,但此查询仍然需要12秒以上的时间。
查询:
SELECT m.id AS match_id,e.event AS event1
FROM matches m
JOIN competitions co ON co.id = m.competition
JOIN clubs h ON h.id = m.hometeam
JOIN clubs a ON a.id = m.awayteam
LEFT JOIN match_events e ON e.match = m.id
AND e.player = '7138'
WHERE (m.hometeam = '1'
OR m.awayteam = '1'
)
AND m.season = '121'
解决方法
确定要在AND e.player = '7138'
的{{1}}子句中使用ON
而不是在LEFT JOIN
子句中吗?
更好的索引编制
推荐这些综合,覆盖,索引:
WHERE
避免OR
m: (season,awayteam,hometeam,competition,id)
e: (player,match,event)
的优化效果不佳。一个常见的技巧是将其变成OR
。这样可能适合您的查询:
UNION
并具有以下两个索引:
SELECT ...
FROM matches JOIN ...
WHERE m.season = 121
AND m.hometeam = 1
UNION ALL
SELECT ...
FROM matches JOIN ...
WHERE m.season = 121
AND m.awayteam = 1
我之所以选择INDEX(season,hometeam) -- will be used by one part of the UNION
INDEX(season,awayteam) -- will be used by the other
是因为它比UNION ALL
快。但是,如果您得到了不必要的欺骗,请进行更改。