【问题标题】:How do I make this personal best highscore MySQL query more efficient?如何让这个个人最好的高分 MySQL 查询更有效率?
【发布时间】:2016-10-21 17:43:33
【问题描述】:

我有一个游戏排行榜高分数据库,目前包含大约 30.000 个条目,下面的查询查找某个游戏和玩家的个人最佳高分,但执行大约需要 60 秒。我在想应该有一种更有效的方法来做到这一点,也许使用复合索引,但那会是哪一种呢?

SELECT name, score, date, version, mode, attempts, time, id
FROM highscore h1
WHERE score = (
  SELECT MAX( score ) 
  FROM highscore h2
  WHERE name = h1.name && gamename = "asteroids" && name = "bob"
)

我目前有以下索引:

id
score
name
name-gamename (composite)

非常感谢任何帮助!

【问题讨论】:

    标签: mysql sql database optimization


    【解决方案1】:

    我会使用标准 SQL 语法编写查询:

    SELECT name, score, date, version, mode, attempts, time, id
    FROM highscore h1
    WHERE score = (SELECT MAX( score ) 
                   FROM highscore h2
                   WHERE h2.name = h1.name AND h2.gamename = 'asteroids' AND h2.name = 'bob'
                  );
    

    为此,您需要一个复合索引:highscore(name, gamename, score)

    如果您只寻找 一个 行(即使有平局),那么这可能会快一点:

    SELECT name, score, date, version, mode, attempts, time, id
    FROM highscore h 
    WHERE h.gamename = 'asteroids' AND h.name = 'bob'
    ORDER BY score DESC
    LIMIT 1;
    

    适当的索引是highscore(name, gamename, score)

    【讨论】:

    • 谢谢,完美运行!作为参考,在我的具体示例中,您对新综合指数的建议采用:0.0290 秒和 0.0172 秒。使第二个对我来说很完美,因为在这种情况下我只需要一排。谢谢!
    • 从 60 秒降低到 0.0172 秒。 . .这是 99.97% 的改进。相当不错;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2013-02-10
    相关资源
    最近更新 更多