0

次の問題のため、現在、テーブルの実行に非常に時間がかかるため、テーブルの最適化にご協力いただければ幸いです。

メインテーブル:

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型を使用します。生年月日、日付

'*'-他のテーブルの主キーである外部キーを指します

1ページは特に遅く、何が起こるかは次のとおりです。

このページには特定のゲームのプレーヤーのラインナップが表示されているので、私のクエリは次のとおりです。

すべてのplayer_id's、number、position FROMplayersテーブルを選択します。WHEREgame_idは、trysテーブルからの特定のゲームのID getTries(player_id、game_id)です。。ドロップゴールテーブルからの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>

誰かが目に見える落とし穴を指摘していただければ幸いです。

よろしく

// 編集

次のクエリを使用しましたが、trysテーブルで見つかった行のみを出力します。見つかったすべてのプレーヤーを出力しますが、彼が獲得し​​た試行回数のみをカウントします。そのプレーヤーの試行がスコアリングされなかった場合は、プレーヤーの詳細を出力する必要がありますが、スコアリングされた試行の場合は0です。

クエリが正しいかどうかわかりません:SELECT ps.player_id、ps.position、ps.number、p.name、p.surname、COUNT(*)AS trysNo FROMplayers ps、player p、trys WHERE p.player_id = ps.player_id AND ps.game_id ='$ game_id' AND ps.team_id IS NULL AND trys.player_id = ps.player_id GROUP BY ps.player_id ORDER BY ps.number

トライを獲得しなかった場合にもプレーヤーを返すようにしたいのですが、今では、トライを獲得した場合にのみプレーヤーを返します。

誰か助けてもらえますか?

4

2 に答える 2

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の2つのテーブルを結合し、最終的にid / position / number/nameのプレーヤーの配列になります。

インデックスを調べることもできます。WHERE句で使用されているフィールド(主キーでまだインデックス付けされていないフィールド)にインデックスを付けることをお勧めします。

他の人が言っているように、どのクエリが遅く実行されているかをより具体的にする必要があります。

于 2009-07-08T16:43:48.717 に答える
0

Unsignedを使用すると、int id列を大きく(2倍のサイズ)することができます。欠点は、負のIDを使用できないことです(とにかく、これは悪です)。

于 2009-07-08T16:13:55.127 に答える