2012-04-26 38 views
7

我有一个在线iphone turnbased游戏,有很多游戏在同一时间运行。我正在优化代码,因为我和服务器今天都崩溃了。1.3M查询/小时。你将如何构建查询?

这是设置:

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

这工作很好,直到大约1000人下载游戏并播放。服务器崩溃。

因此,为了优化,我想我可以创建一个名为“matches_needs_update”的新表。这张桌子有两排;名称和ID。 “id”与“matches”表中的匹配相同。当比赛更新时,它被放在这张桌子上。

现在,而是通过整个“匹配”表搜索,查询只检查,如果玩家有需要更新的任何比赛,然后从“匹配”表中获取这些比赛。

我的问题是双重的:

  1. 这是最佳的解决方案?
  2. 如果一个玩家在10个比赛中活跃,是否有一种很好的方法可以同时从“比赛”表中获得这10个比赛,或者我需要一个for循环做10个查询,每个匹配:

    “SELECT * FROM matches WHERE id =?”

在此先感谢

+6

虽然问题严重,但如果您仔细考虑,这是您遇到的最佳问题之一。来自太多实际用户的崩溃是最好的一种崩溃。 – Cyclone 2012-04-26 19:57:24

+1

使用推送通知的解决方案可能是解决性能问题的更好方法。这样你就不会有很多冗余的转弯检查 – 2012-04-26 19:57:38

+1

它几乎听起来像1人可以在多场比赛中活跃,并且多人可以在1场比赛中活跃?当然,你必须有3桌? – DanRedux 2012-04-26 20:08:16

回答

6

我建议APC ...

...因为您是在PHP,我假设你从一个单一的MySQL数据库这样做,

它易于安装,将从PHP 6开始默认。

将这张表保存在内存中,它会飞。

+0

感谢您的回复。我是否需要更新所有的php代码来处理它,还是只是为了安装?谢谢 – BlackMouse 2012-04-26 21:16:04

+0

APC是2件事。它是一个操作码缓存(缓存PHP代码以便加载更快)以及内存存储(即键值)。第一部分自动发生,并提高速度。但你对第二点感兴趣。所以是的 - 你需要更新你的代码。阅读我链接的手册页面,并从apc_store开始获取此主意。 – HappyTimeGopher 2012-04-27 09:23:11

7

你需要走出的数据库。看看memcache或redis。

2

你的数据库看起来很小。一个包含70行的表应该在毫秒内返回,甚至每秒几百个查询应该可以毫无问题地工作。

一对夫妇的传统指针

  • 的确保你集中你的连接。当客户需要数据时,您绝不应该进行连接。
  • 确保“user is in match”上有一个索引,以便从索引中获取结果。
  • 我相信你有足够的内存来保存缓存中的整个结构,并且这些小表不需要额外的配置。
  • 确保您的模式已标准化。每个用户一张桌子。每场比赛一场。还有一个用于比赛中的每个用户。
1

它的时候开始缓存的东西如内存缓存和APC。

至于循环虽然比赛......这是错误的方式去做。

如何用户通过一个外部参照TABEL连接到匹配?或者比赛表是否有像player1,player2这样的东西。

循环虽然查询是不是要正确索引你的表,做一个参加由用户名字我会更有效地拉动所有活动比赛的方式。 Givin您可能还想要的用户数量(如果您没有)将表格分为活动和非活动游戏。

如果那里有6000个活动性游戏至3,000,000无活性的极为有利划分这些表。