0

ユーザーが互いにチェスをするゲームの Web サイトを運営しているとします。個々のチェスの動きを含むすべてのゲームを含む MySQL テーブルがあります。

ゲーム テーブル(疑似構文):

gameId INT
player1Id INT
player2Id INT
gameEnded DATETIME NULL
gameNotation TEXT

いくつかの行は次のようになります。

30021, 2001, 3020, '2013-08-01 12:00:00', '1. e4 e5 2. Nf3 Nf6'
30022, 3020, 2001, NULL, '1. d4'

gameNotation フィールドは、100 手以上で非常に大きくなる可能性があります。

私の質問に対して:上記に似た私のテーブルには 100 万行とカウントが含まれているため、パフォーマンスの点で困難です。

このテーブルをどのように分割しますか (MySQL 6.5)? それとも、gameNotation 列を独自のテーブルに移動しますか? 同じテーブルに進行中のゲームと終了したゲームの両方があります。パフォーマンスの観点から何が最も理にかなっているのかわかりません。

御時間ありがとうございます!

4

2 に答える 2

2

これには適切なインデックスが必要ですが、100 万行はそれほど大きくありません。

主な問題はおそらく、TEXT複数の値を保持する列にあるため、全文検索や線形検索が必要になります。おそらく移動を独自のテーブルに移動し、1対多の関係を使用することにより、単一の値を格納するようにDB構造を変更できます。

これには、すべてのレコードが同じサイズになるため (他の可変サイズの列がないことを前提として)、断片化を減らすという利点が追加されます。

于 2013-08-01T17:02:23.330 に答える
1

はい、たぶん。

gameId INT
player1Id INT
player2Id INT
gameEnded DATETIME NULL
gameNotation TEXT

私はおそらくそれを次のように分割します:

ゲーム:

id INT NOT NULL <-PK,AUTOINCREMENT
white_player_id INT NOT NULL
black_player_id INT NOT NULL
gameEnded DATETIME

動き:

id INT NOT NULL <-PK,AUTOINCREMENT
game_id INT NOT NULL
move VARCHAR(9) NOT NULL //Change length if necessary
于 2013-08-01T17:46:26.090 に答える