国际象棋游戏场景中100万行MySQL表的性能

时间:2013-08-01 16:59:04

标签: mysql performance database-design database-performance database-partitioning

假设我运行一个游戏网站,用户互相下棋。我有一个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列移动到自己的表中吗? 我在同一张桌子上都有正在进行和结束的比赛,也许我应该将它们分开?从性能角度来看,我不确定最有意义的是什么。

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

这需要适当的索引,但是100万行不是那么大。

关键问题可能在于您的TEXT列,包含多个值 - 因此需要进行全文搜索和/或线性搜索。您可以更改数据库结构以存储单个值,可能是将移动移动到他们自己的表并使用一对多关系。

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

答案 1 :(得分: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