1.3M查询/小时。你会如何构建查询?

时间:2012-04-26 19:53:57

标签: php iphone mysql phpmyadmin

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

这是设置:

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

直到大约1000人下载游戏并玩游戏之前,这种方法很有效。服务器崩溃了。

所以为了优化,我想我可以创建一个名为“matches_needs_update”的新表。这个表有2行;名称和ID。 “id”与“匹配”表中的匹配相同。更新匹配后,将其放入此表中。

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

我的问题有两个:

  1. 这是最佳解决方案吗?
  2. 如果一个玩家处于活动状态,例如10个匹配,是否有一个很好的方法可以同时从“匹配”表中获得这10个匹配,或者我需要一个for循环执行10个查询,一个每场比赛:

    “SELECT * FROM匹配WHERE id =?”

  3. 提前致谢

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:6)

我建议APC ...

...当你使用PHP时,我假设你是从一个mysql数据库中做到这一点,

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

将此1个表保留在内存中,它会飞。

答案 2 :(得分:2)

您的数据库看起来很小。一个包含70行的表应该在几毫秒内返回,甚至每秒数百个查询应该没有任何问题。

一些传统指针

  • 确保汇集您的连接。当客户需要数据时,您永远不必进行连接。
  • 确保“用户匹配”中有索引,以便从索引中获取结果。
  • 我确信你有足够的内存来保存缓存中的整个结构,并且这些小表不需要额外的配置。
  • 确保您的架构已规范化。每个用户一张桌子。每场比赛一场。并且每场比赛都有一场比赛。

答案 3 :(得分:1)

是时候开始缓存内容了,例如memcache和apc。

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

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

循环虽然查询不是正确索引表并通过userId进行连接以拉出所有活动匹配的方法,但我会更有效率。给你可能想要的用户数量(如果你还没有)分配活动和非活动游戏。

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