一千萬個為什麽

搜索

優化慢排名查詢

我需要優化查詢以獲取永久性的排名(查詢本身可行,但我知道它很糟糕,我只是嘗試了大量的記錄並且它給出了超時)。

我將簡要解釋一下這個模型。我有3個桌子:球員,球隊和球員隊員。我有球員,可以屬於球隊。聽起來很明顯,玩家存儲在玩家桌面和團隊中。在我的應用程序中,每個玩家可以隨時切換團隊,並且必須保留日誌。但是,在給定時間,玩家被認為僅屬於一個團隊。現在的球員隊伍是他加入的最後一支隊員。

我認為,球員和球隊的結構並不相關。我每個都有一個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),但這沒有削減它。

我嘗試了一些不起作用的查詢,但設法讓這個工作。

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

最佳答案

嘗試這個:

SELECT  t.*, cnt
FROM    (
        SELECT  team_id, COUNT(*) AS cnt
        FROM    (
                SELECT  player_id, MAX(id) AS mid
                FROM    player_team
                GROUP BY
                        player_id
                ) q
        JOIN    player_team pt
        ON      pt.id = q.mid
        GROUP BY
                team_id
        ) q2
JOIN    team t
ON      t.id = q2.team_id
ORDER BY
        cnt DESC
LIMIT 50

player_team(player_id,id)(按此順序)上創建一個索引,以便快速工作。

轉載註明原文: 優化慢排名查詢