2009-07-08 60 views
0

我真的很感激,如果你們中的一些可以幫助優化我的表,因爲它們目前採取非常長的時間執行,因爲以下問題:MySQL的 - 請幫助優化,我不知道如何

主表:

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的(無符號整數[5])?我有點不確定,如果VARCHAR(500..200)根據需要

我用DATE類型在那裏我可以如大小需要UNSIGNED

所有文本。 DOB,日期

「*」 - 是指外鍵是主鍵在其他表

一個頁面特別慢,會發生什麼情況如下:玩家

頁面顯示的陣容對於特定的遊戲,所以我的查詢有以下幾種:

選擇所有player_id的,數目,位置從球員表WHERE game_id是從嘗試表 特定遊戲的ID getTries(player_id,game_id)。 。從球員表 getDropgoals(player_id,game_id)從dropgoals表

getPlayerName(player_id)

輸出到餐桌的接收細節

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

我真的很感激,如果有人可以指出一些可見的陷阱。

問候

//編輯

我用下面的查詢,但它只輸出,在嘗試表中找到行,我希望它輸出找到的所有球員,但只算次數的嘗試,如果沒有對該玩家進行任何嘗試,那麼它仍然必須輸出玩家詳細信息,但是對於嘗試得分,則爲0。

我不確定我的查詢是否正確: SELECT ps.player_id,ps.position,ps.number,p.name,p.surname,COUNT(*)AS attemptsNo FROM players ps,player p,try 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

我也希望它也可以如果他沒有進行任何嘗試,就返回一名球員,但現在只有在他進行了一次嘗試後纔會返回球員。

任何人都可以幫忙嗎?

+5

如何發佈你想優化的SQL和EXPLAIN SELECT的輸出...... – Greg 2009-07-08 15:58:22

+0

你的結構看起來非常簡單。正如格雷格提到的那樣,給出特定的查詢運行緩慢此外,張貼有索引的列。 – safoo 2009-07-08 16:03:26

回答

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子句中使用的任何字段(未使用主鍵索引)是一個好主意。

正如其他人所說的,您需要更具體地瞭解哪些查詢運行緩慢。

0

無符號將使您有一個更大的(double size)int id列。缺點是你將無法使用負號(反正它是邪惡的)。

+0

但沒有簽名對執行速度有任何影響? – 2009-07-09 06:49:07