簡體   English   中英

MySQL-有效地獲取給定ID的每個組的最大值

[英]Mysql - Get the maximum value of each group for a given id, efficiently

我們有一個表格,其中記錄了某些游戲的用戶得分。 我們想要的是顯示每個用戶每個游戲的最高得分 請注意,每個用戶可能已經提交了1000多個分數,社區很大(因此用戶越來越多),並且有很多游戲。 我們已經在以下類似問題中使用了此查詢:

SELECT f1.userkey, f1.score, dateachieved, timeachieved, `MA_users`.username
FROM (
      (
        SELECT userkey, max( score ) AS score
        FROM `MA_scores`
        WHERE gameid = '$gameid'
        AND STATUS = 'approved'
        GROUP BY userkey
      ) AS f1
      JOIN (
        SELECT userkey, score, dateachieved AS dateachieved, timeachieved AS timeachieved
        FROM `MA_scores`
        WHERE gameid = '$gameid'
        AND STATUS = 'approved'
        GROUP BY score DESC , userkey
        ORDER BY `score` DESC
      ) AS T2 
      ON f1.userkey = T2.userkey
      AND f1.score = T2.score
)
JOIN `MA_users` ON f1.userkey = `MA_users`.userkey
LIMIT 0 , 20;

上面的問題是,它需要一些時間才能完成,結果該站點無法快速訪問(延遲了幾秒鍾)(因此,我們已經從mysql中看到了50%的cpu使用率)。 我們知道這是已知的每組最多n個問題,請在此處閱讀一些問題以及一些博客文章,但它們似乎並沒有充分提高查詢速度。

因此問題是:是否有更有效的查詢來檢索所需結果? 此外,查詢應使用哪些索引以使其更快地運行? (為了避免使用filesort;也使用臨時等),謝謝!

不必每次都查詢它,而要擁有所謂的Statistics表有兩列: userkeymax_score 您可以很容易地回填此表; 訣竅將是使其保持最新狀態。

您可以在插入新行時在MA_scores表上放置觸發器。 觸發只會從表中該選擇MAX(分數) userkey和更新的Statistics表。

我不知道這與您現有的體系結構如何吻合,或者甚至不是一個很棒的主意,但它的讀取時間非常快,並且在MA_scores表上具有適當的索引,總體上可能非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM