Plesk 与本地 PC 上的 MariaDB 慢查询
Posted
技术标签:
【中文标题】Plesk 与本地 PC 上的 MariaDB 慢查询【英文标题】:MariaDB Slow Query on Plesk vs local PC 【发布时间】:2021-01-02 06:40:47 【问题描述】:我有以下查询,我很欣赏它可能写得不好,但在我的本地 PC 上使用 Xampp 和 MariaDB,它在 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'
【问题讨论】:
【参考方案1】:您确定在LEFT JOIN
的ON
子句中需要AND e.player = '7138'
,而不是在WHERE
子句中吗?
更好的索引
推荐这些复合、覆盖、索引:
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
,因为它比UNION DISTINCT
快。但是如果你得到了不需要的重复,那就改变它。
【讨论】:
以上是关于Plesk 与本地 PC 上的 MariaDB 慢查询的主要内容,如果未能解决你的问题,请参考以下文章
从远程 pc 在 C# 中生成 s-s-rS 2008 R2 报告比从本地 pc 慢
与 XAMPP 相比,MariaDB Docker 容器中的 INSERT SQL 查询非常慢