我们有一个 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
最佳答案
您应该真正考虑运行高可用性 RDS 并为其设置只读副本。这样您就可以在副本上随心所欲地运行复杂的查询,而不会干扰生产数据库。
2GB(大小)的数据库实际上并没有那么大。如果您尝试查询的表上有正确的索引,则不应锁定数据库。
最重要的是,如果您不知道它将做什么,请不要在高容量生产数据库上运行查询。从上面的评论可以看出,您显然不是一位经验丰富的数据库管理员。没关系。在大容量服务器上工作对您来说肯定是一次学习经历,只是尽量不要让您的类(class)让您的服务崩溃。同样,这就是为什么在尝试对大型表进行查询之前拥有副本或创建数据库快照并设置测试数据库是一个非常好的主意。
关于mysql - SQL 查询破坏了我们的游戏! (后端服务器已满),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13633959/