SQL查询打破了我们的游戏! (后端服务器容量)

时间:2012-11-29 20:15:51

标签: mysql sql amazon-web-services mysql-workbench amazon-rds

我们有一款Facebook游戏,可将所有持久数据存储在运行于大型Amazon RDS实例的MySQL数据库中。我们的一张桌子是2GB大小。如果我在该表上运行任何超过几秒钟的查询,我们游戏执行的任何SQL操作都将失败并显示错误:

HTTP / 1.1 503服务不可用:后端服务器处于容量

这显然会打倒我们的游戏!

我在这些时间段内监视了RDS实例上的CPU使用情况,尽管它确实飙升,但它并没有超过50%。以前我们的实例规模较小,确实达到了100%,所以我希望在这个问题上投入更多CPU容量才能解决问题。我现在认为这是开放连接数量的问题。但是,我只使用SQL大约8个月左右,所以我不是MySQL配置方面的专家。

是否可能有一些配置设置我可以更改以防止这些查询超载服务器,或者我应该在游戏结束时不运行它们?

我正在使用MySQL Workbench来运行查询。

非常感谢任何帮助 - 谢谢!

编辑:

这是一个例子......

SELECT * 
FROM BlueBoxEngineDB.Transfer 
WHERE Amount = 1000 
AND FromUserId = 4 
AND Status='Complete';

表格如下:

TransferId  Started  Status  Expires  FromUserId  ToUserId  CurrencyId  Amount  SessionId

1177    2012-06-04 21:43:18 Added       150001      2           4           1   12156
1179    2012-06-04 21:48:50 ISF         150001      2           4           1   12156
1181    2012-06-04 22:08:33 Added       150001      2           4           25  12156
1183    2012-06-04 22:08:41 Complete    150001      2           4           50  12156
1185    2012-06-04 22:08:46 Added       150001      2           4           200 12156

3 个答案:

答案 0 :(得分:1)

您应该考虑运行高可用性RDS并设置它的只读副本。这样,您就可以在副本上运行复杂的查询到您的内容,而不会干扰生产数据库。

2GB(大小)数据库真的不是那么大。如果您在尝试查询的表上有正确的索引,则不应该锁定数据库。

最重要的是 - 如果您不知道它将要做什么,请不要在高容量生产数据库上运行查询。从上面的评论中可以清楚地看出,您不是一位经验丰富的数据库管理员。没关系。在大容量服务器上工作肯定是一种学习体验,只是尽量不要让你的课程在你的服务崩溃。同样,这就是为什么在对大型表进行查询之前拥有副本,创建数据库快照和设置测试数据库是一个非常好的主意。

答案 1 :(得分:1)

您可能需要调整架构(adding indexes是直接的步骤)。

要分析您的情况,您可以访问数据库的MySQL慢查询日志,以确定是否存在运行缓慢的SQL查询,如果存在,则确定每个查询的性能特征。您可以设置“slow_query_log”数据库参数并查询mysql.slow_log表以查看运行缓慢的SQL查询。请参阅Amazon RDS User Guide了解详情。

您可能会考虑将某些表格卸载到DynamoDBRedis。它们都会产生一位数毫秒的延迟,因此在游戏开发者中非常受欢迎。您只需要考虑一下data structure

答案 2 :(得分:1)

(FromUserId, Amount, Status)上的索引可能有助于此查询。

您可能会遇到更多针对此表的查询变体。为每一个添加一个索引,将导致您在表中有数十个索引,这可能会带来其他问题。

尝试分析慢查询日志,然后优化最慢的查询(以及使用更多CPU百分比的查询)。