【问题标题】:MySQL - Please help with optimization, I am not sure howMySQL - 请帮助优化,我不知道如何
【发布时间】: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


【解决方案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 子句中使用的任何字段(尚未使用主键建立索引)编制索引。

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

【讨论】:

  • 感谢您的建设性意见,因为我完全忘记了合并这样的查询,我现在会尝试这样做,并返回一些仍然运行缓慢的查询。
【解决方案2】:

无符号将使您拥有更大(两倍大小)的 int id 列。缺点是您将无法使用负 ID(无论如何,这很邪恶)。

【讨论】:

  • 但是无符号对执行速度有什么影响吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2013-12-30
相关资源
最近更新 更多