我需要优化一个查询的排名是永久的(查询本身的作品,但我知道这是可怕的,我刚刚试了很多记录,它会给超时) 。优化慢速排名查询
我会简单介绍一下这个模型。我有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