我需要優化一個查詢的排名是永久的(查詢本身的作品,但我知道這是可怕的,我剛剛試了很多記錄,它會給超時) 。優化慢速排名查詢
我會簡單介紹一下這個模型。我有3個表格:球員,球隊和player_team。我有球員,可以屬於一個球隊。聽起來很明顯,球員被存儲在球員表中並且團隊合作。在我的應用程序中,每個玩家可以隨時切換隊伍,並且必須記錄日誌。然而,在給定時間,球員被認爲只屬於一個球隊。現在的球員隊伍是他加入的最後一個球隊。
我認爲球員和球隊的結構並不相關。我有一個id列在每個PK。在player_team中,我有:
id (PK)
player_id (FK -> player.id)
team_id (FK -> team.id)
現在,每個球隊都會爲每個參加球員的球員分配一個積分。所以,現在我想要得到最多球員人數最多的前N隊的排名。
我的第一個想法是首先從player_team中獲得當前球員(這是每個球員的最高記錄;該記錄必須是球員當前的球隊)。我沒有找到一個簡單的方法來做到這一點(嘗試GROUP BY player_team.player_id HAVING player_team.id = MAX(player_team.id),但這並沒有削減它
我試了一些querys didn'將不起作用,但設法得到這個工作。
SELECT
COUNT(*) AS total,
pt.team_id,
p.facebook_uid AS owner_uid,
t.color
FROM
player_team pt
JOIN player p ON (p.id = pt.player_id)
JOIN team t ON (t.id = pt.team_id)
WHERE
pt.id IN (
SELECT max(J.id)
FROM player_team J
GROUP BY J.player_id
)
GROUP BY
pt.team_id
ORDER BY
total DESC
LIMIT 50
正如我所說的,它的工作原理,但看起來很糟糕,執行得很差,所以我敢肯定,必須有一個更好的方式去。任何人有任何想法優化呢?
我使用MySQL,順便說一句。
在此先感謝
添加說明。 (對不起,如何正確格式化)
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t ALL PRIMARY NULL NULL NULL 5000 Using temporary; Using filesort
1 PRIMARY pt ref FKplayer_pt77082,FKplayer_pt265938,new_index FKplayer_pt77082 4 t.id 30 Using where
1 PRIMARY p eq_ref PRIMARY PRIMARY 4 pt.player_id 1
2 DEPENDENT SUBQUERY J index NULL new_index 8 NULL 150000 Using index
你永久留下曾經在player_team發生的每一個球員的團隊組合?你是不是以任何方式標記這一點(一個歷史關係爲0的列,當前一個很好的情況下爲1)? – marr75 2010-05-07 13:25:51
是的,我要離開組合,因爲我必須保留一個日誌。我想過有一面旗幟,如果沒有更好的選擇,可能會這樣。但我也許有更好的辦法。 (我是一個sql noob!)感謝您的建議,但。 – 2010-05-07 13:31:53
請發表您的解釋。 – 2010-05-07 13:36:25