2012-01-20 21 views
1

我們有一張表,它記錄了某些遊戲中用戶的分數。我們想要的是顯示每個遊戲的最高得分。請注意,每個用戶可能已經提交了1000多個分數,社區很大(因此用戶數量越來越多),並且有很多遊戲。 我們已經使用此查詢在一個類似的問題在這裏找到:Mysql - 有效地獲得給定ID的每個組的最大值

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的CPU使用率爲50%)。 我們知道這是已知最大的每組問題,並在這裏閱讀了一些問題和一些博客文章,但他們似乎沒有提高查詢的速度。

所以問題是:是否有任何更有效的查詢來檢索所需的結果?而且,哪些索引應該與查詢一起使用,以便加快速度? (爲了避免使用filesort;使用臨時等等) 謝謝!

回答

0

而不是每次查詢它,有什麼關於有一個所謂的Statistics表,其中有兩列:userkeymax_score。你可以很容易地回填這張桌子;訣竅將保持最新。

您可以在MA_scores表上插入一個觸發器,以便插入新行。觸發器將簡單地從表中爲該userkey選擇MAX(得分)並更新Statistics表。

我不知道這是如何適合您現有的架構,或者如果它甚至是一個偉大的想法,但它會有快速的閱讀時間,並在MA_scores表上有適當的索引,可能是相當快的整體。

+0

謝謝,我將它標記爲已接受,因爲沒有人回覆,因爲它是一個聰明的答案:),我想我可以擴展它更多以緩存它,並刪除緩存文件時,任何新的條目/更新發生在統計表:) – upeer