【问题标题】:MariaDB Slow Query on Plesk vs local PCPlesk 与本地 PC 上的 MariaDB 慢查询
【发布时间】: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'

【问题讨论】:

    标签: mysql xampp mariadb plesk


    【解决方案1】:

    您确定在LEFT JOINON 子句中需要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 快。但是如果你得到了不需要的重复,那就改变它。

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 2019-09-29
      • 2018-08-19
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2016-07-25
      相关资源
      最近更新 更多