【发布时间】:2010-11-09 02:20:11
【问题描述】:
如果你们中的一些人可以帮助优化我的表格,我将不胜感激,因为由于以下问题,它们目前需要很长时间才能执行:
主表:
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's,number,position 其中 game_id 是特定游戏的 id 来自尝试表的 getTries(player_id,game_id) . . getDropgoals(player_id,game_id) 从 dropgoals 表中
getPlayerName(player_id) 从 player 表
输出到表格接收到的详细信息
<tr>
<td>tries</td>...<td>dropgoals</td><td>position</td><td>player's name</td><td>number</td></tr>
如果有人能指出一些明显的缺陷,我将不胜感激。
问候
// 编辑
我使用了以下查询,但它只输出在尝试表中找到的行,我希望它输出找到的所有玩家,但只计算他得分的尝试次数,如果没有尝试得分球员,它仍然必须输出球员的详细信息,但得分为 0。
我不确定我的查询是否正确: 选择 ps.player_id, ps.position, ps.number, p.name, p.surname, COUNT(*) AS TrysNo 从玩家 ps, 玩家 p, 尝试 WHERE p.player_id=ps.player_id AND ps.game_id = '$ game_id' AND ps.team_id 为 NULL AND Tryes.player_id = ps.player_id GROUP BY ps.player_id ORDER BY ps.number
如果他没有尝试得分,我希望它也返回一个玩家,现在它只返回一个尝试得分的玩家。
有人可以帮忙吗?
【问题讨论】:
-
如何发布您要优化的 SQL 和 EXPLAIN SELECT 的输出...
-
你的结构看起来很简单。正如 Greg 提到的,给出运行缓慢的特定查询。此外,发布具有索引的列。
标签: php mysql query-optimization