0

假设我经营一个游戏网站,用户在该网站上互相下棋。我有一个 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列,它包含多个值——因此需要全文搜索和/或线性搜索。您可以更改数据库结构以存储单个值,可能通过将移动移动到它们自己的表并使用一对多关系。

这将具有减少碎片的额外好处,因为您的所有记录都将具有相同的大小(假设没有其他可变大小的列)。

于 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 回答