MySQL - 请帮助优化,我不知道如何

时间:2009-07-08 15:55:12

标签: php mysql query-optimization

如果你们中的一些人可以帮助优化我的表格,我会非常感激,因为他们目前因为以下问题需要很长时间才能执行:

主表:

game {
   game_id [PRIMARY KEY]
   *team_id
   *stadium_id
   home_score
   opponent_score
   date
   tour
   half_home_score
   half_opp_score
   attendance
   referee_id
   coach_id
   captain_id
}

players (contains all players that played in the game) {
    *game_id
    *team_id
    *player_id
    position
    number
}

tries, conversions, penalties, dropgoals {
    *player_id
    *game_id
    *team_id
}

team {
    team_id [PRIMARY KEY]
    country
}

player {
    player_id [PRIMARY KEY]
    *team_id
    name
    surname
    fullname
    DOB
    POB
    school
    height
    weight
    position
}

我倾向于制作所有类型的* _id(UNSIGNED INT [5])?我不确定是否需要UNSIGNED

所有文字都是VARCHAR(500..200),具体取决于所需的尺寸

我可以使用DATE类型。 DOB,日期

'*' - 指的是作为其他表中主键的外键

一页特别慢,会发生以下情况:

该页面显示了特定游戏的玩家阵容,因此我的查询如下:

选择所有player_id的,数字,位置FROM玩家表WHERE game_id是特定游戏的id 来自尝试表的getTries(player_id,game_id) 。 。 来自dropgoals表的getDropgoals(player_id,game_id)

来自播放器

getPlayerName(player_id)

输出以表示收到的详细信息

<tr>
<td>tries</td>...<td>dropgoals</td><td>position</td><td>player's name</td><td>number</td></tr>

如果有人能指出一些明显的陷阱,我真的很感激。

此致

//编辑

我使用了以下查询,但它只输出了在try表中找到的行,我希望它输出找到的所有玩家,但只计算他得分的尝试次数,如果没有得分的尝试玩家,它仍然必须输出玩家的详细信息,但是对于尝试得分,则必须输出0。

我不确定我的查询是否正确: SELECT ps.player_id,ps.position,ps.number,p.name,p.surname,COUNT(*)AS triesNo FROM players ps,player p,尝试WHERE p.player_id = ps.player_id AND ps.game_id ='$ game_id'AND ps.team_id IS NULL AND tries.player_id = ps.player_id GROUP BY ps.player_id ORDER BY ps.number

如果他没有得分,我希望它能让球员回归,现在只有在尝试进球时才能让球员回归。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

根据它的声音,如果您一次从多个表中进行选择,则可能是(a)在页面加载时运行了太多查询,或者(b)未在相应字段上加入数据。

例如,根据您的说法,您似乎运行了一整套查询来获取玩家名称,但您可以将其与第一个查询合并,如下所示:

SELECT ps.player_id, ps.position, ps.number, p.name
FROM players ps, player p
WHERE p.player_id=ps.player_id

该查询加入了player_id上的两个表格,最终得到了一组id / position / number / name的玩家。

您可能还想查看索引。索引WHERE子句中使用的任何字段(尚未使用主键索引)是个好主意。

正如其他人所说,你需要更具体地了解哪些查询运行缓慢。

答案 1 :(得分:0)

无符号将使您具有更大(双倍大小)的int id列。缺点是你将无法使用负面的ID(无论如何都是邪恶的。)