表在MySQL数据库中太大了

时间:2010-08-21 20:04:38

标签: php mysql load scalability

我在我的数据库中制作了一个在线游戏和一个表格。也许是最重要的一个。它开始变得非常大。我正在创建一个函数,您可以与多个用户一起使用,为此我有一个到目前为止看起来像这样的表:

CREATE TABLE `oc` (
  `id` int(11) NOT NULL auto_increment,
  `leader` varchar(40) NOT NULL default '',

  `car` int(11) NOT NULL default '0',
  `car_type` char(2) NOT NULL default '',  

  `seats` varchar(3) NOT NULL default '0',
  `share` enum('1','2') NOT NULL default '1',
  `location` varchar(100) NOT NULL default '',  

  `user1` varchar(40) NOT NULL default '', 
  `user2` varchar(40) NOT NULL default '',  
  `user3` varchar(40) NOT NULL default '', 
  `user4` varchar(40) NOT NULL default '', 
  `user5` varchar(40) NOT NULL default '',  
  `user6` varchar(40) NOT NULL default '', 
  `user7` varchar(40) NOT NULL default '', 
  `user8` varchar(40) NOT NULL default '', 
  `user9` varchar(40) NOT NULL default '', 

  `leader_gun` char(2) NOT NULL default '', 
  `user1_gun` char(2) NOT NULL default '', 
  `user2_gun` char(2) NOT NULL default '',  
  `user3_gun` char(2) NOT NULL default '', 
  `user4_gun` char(2) NOT NULL default '', 
  `user5_gun` char(2) NOT NULL default '',  
  `user6_gun` char(2) NOT NULL default '',  
  `user7_gun` char(2) NOT NULL default '', 
  `user8_gun` char(2) NOT NULL default '', 
  `user9_gun` char(2) NOT NULL default '',   

  `user1_inv` varchar(40) NOT NULL default '', 
  `user2_inv` varchar(40) NOT NULL default '',  
  `user3_inv` varchar(40) NOT NULL default '', 
  `user4_inv` varchar(40) NOT NULL default '', 
  `user5_inv` varchar(40) NOT NULL default '',  
  `user6_inv` varchar(40) NOT NULL default '',  
  `user7_inv` varchar(40) NOT NULL default '', 
  `user8_inv` varchar(40) NOT NULL default '', 
  `user9_inv` varchar(40) NOT NULL default '',    

  `user1_ready` enum('0','1') NOT NULL default '1', 
  `user2_ready` enum('0','1') NOT NULL default '1',  
  `user3_ready` enum('0','1') NOT NULL default '1', 
  `user4_ready` enum('0','1') NOT NULL default '1',  
  `user5_ready` enum('0','1') NOT NULL default '1', 
  `user6_ready` enum('0','1') NOT NULL default '1',  
  `user7_ready` enum('0','1') NOT NULL default '1', 
  `user8_ready` enum('0','1') NOT NULL default '1',   
  `user9_ready` enum('0','1') NOT NULL default '1',     

  PRIMARY KEY  (`id`)
) TYPE=MyISAM ;

现在我想知道我的局限是什么。拥有多达30个可以一起玩的用户会很酷,但是我的表需要3倍的字段。 30 x user1_gun 30 x user1_inv和30 x user1_ready

此数据库将被大量使用,因为所有用户在访问页面时都需要数据库中的所有信息以列出所有其他用户名等。所有用户还可以更改表中的至少3个值。

我应该将我的表限制为9个用户还是可以为100个用户创建一个表?我不知道。我可以编写一些代码,但之前从未管理过大型的mysql数据库和服务器。

编辑:好的。只是为了清楚。我有一个用户表,其中包含我的用户的各种信息,一个连接到用户表的汽车的表,一个连接到我的用户表的武器的表。 这不是我唯一一个最多有9名玩家可以玩游戏的桌子! oc表需要有每个用户选择的用户名和枪支的字段以及已表示已准备就绪的用户。我认为我不需要数据库规范化......

2 个答案:

答案 0 :(得分:7)

你真的需要normalize你的数据库!您正在使用关系数据库,因此您应该做的第一件事是定义数据中的关系。

游戏与玩家之间存在一对多的关系(一个游戏可以有很多玩家,但玩家一次只能玩一个游戏)。因此,您应该创建一个游戏表,其中包含与每个游戏(id,leader,car,car_type,seat,share,location)相关的信息。然后创建一个单独的用户表,其中包含特定于用户的所有数据(id,name,gun,inventory,ready)。然后,您可以使用foreign keys将用户表链接到游戏表。因此,除了已经提到的用户信息之外,用户表还应包括诸如game_id之类的字段,该字段将游戏表中的游戏ID存储为外键。

你可以通过包括枪台,汽车桌等来进一步规范化。

规范化可减少冗余数据,提高数据库效率并减少数据异常。这里是对这个概念的一个很好的介绍:http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html这也可以解决连接表,查询规范化数据库时需要做的事情。

编辑: 为了回应您的澄清,您可能希望查看除数据库之外的其他解决方案。你真的不应该在关系数据库中有一个看起来像这样的表。根据您提供的信息,似乎所有这一切都在跟踪游戏内信息,并且可能有比关系数据库更好的解决方案。

如果您确实希望将此信息保存在关系数据库中,则仍应对其进行规范化。因此,如果您已经有一个单独的用户表,则需要将其展开以考虑游戏内用户信息,或者可能有一个active_users表,其中包含特定于当前游戏的信息。

答案 1 :(得分:1)

为什么不选择两列db:基本上是一个关键值得分。由于它是一款在线游戏,因此可以轻松使用内存缓存来快速访问数据。

这两列是关键和值 值将是数据的json表示。