7

我有一个在线 iphone 回合制游戏,同时运行很多游戏。我正在优化代码,因为我和服务器今天都崩溃了。

这是设置:

现在我有一个表,“匹配”(每行 70 个数据字段。结构),它跟踪所有活动的匹配。每隔 7 秒,iphone 将连接,下载他/她活动的“matches”表中的所有匹配项,并更新 iphone 中的 UI。

在大约 1,000 人下载并玩这款游戏之前,这种方法效果很好。服务器崩溃了。

所以为了优化,我想我可以创建一个名为“matches_needs_update”的新表。该表有 2 行;姓名和身份证。“id”与“matches”表中的匹配项相同。更新匹配时,会将其放入此表中。

现在,为了搜索整个“matches”表,查询只是检查玩家是否有任何需要更新的匹配项,然后从“matches”表中获取这些匹配项。

我的问题是双重的:

  1. 这是最佳解决方案吗?
  2. 如果玩家活跃,比如说 10 场比赛,有没有一种好方法可以同时从“比赛”表中获取这 10 场比赛,或者我是否需要一个 for 循环进行 10 次查询,每场比赛一个:

    “SELECT * FROM 匹配 WHERE id = ?”

提前致谢

4

4 回答 4

7

你需要离开数据库。查看 memcache 或 redis。

于 2012-04-26T19:57:18.667 回答
6

我建议APC ...

...当您使用 PHP 时,我假设您是从单个 mysql 数据库中执行此操作的,

它很容易安装,并且从 PHP 6 开始是默认的。

将此 1 表保存在内存中,它会飞起来。

于 2012-04-26T19:58:54.020 回答
2

您的数据库看起来非常小。一个有 70 行的表应该在几毫秒内返回,甚至每秒数百个查询应该可以正常工作。

几个传统的指针

  • 确保您汇集您的连接。当客户需要数据时,您永远不必进行连接。
  • 确保“用户匹配”上有一个索引,以便从索引中获取结果。
  • 我确定您有足够的内存来将整个结构保存在缓存中,并且使用这些小表不需要额外的配置。
  • 确保您的架构已标准化。每个用户一张桌子。每场比赛一个。并且为匹配中的每个用户提供一个。
于 2012-04-26T20:05:13.777 回答
1

是时候开始缓存东西了,例如memcache 和apc。

至于循环比赛……这是错误的做法。

用户如何通过外部参照表连接到匹配项?还是比赛表有类似player1,player2的东西。

循环查询并不是正确索引表并执行联接以通过 userId 提取所有活动匹配项的方法,这样我会更有效率。给出您可能还希望(如果您还没有)将表拆分为活动和非活动游戏的用户数量。

如果有 6000 个活动游戏和 3,000,000 个不活动游戏,则对这些表进行分区非常有利。

于 2012-04-26T20:13:39.363 回答