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