【发布时间】:2012-11-18 00:13:19
【问题描述】:
我们有一个 Facebook 游戏,它将所有持久数据存储在 MySQL 数据库中,该数据库在大型 Amazon RDS 实例上运行。我们的一张桌子大小为 2GB。如果我在该表上运行任何花费超过几秒钟的查询,我们的游戏执行的任何 SQL 操作都将失败并出现错误:
HTTP/1.1 503 Service Unavailable: 后端服务器满负荷
这显然会拖垮我们的游戏!
我在这些时间段内监控了 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
【问题讨论】:
-
我假设大表已经有适当的索引?
-
即使表是 2GB,如果您没有对它们变得超级复杂,查询通常不会超过几秒钟。请发布示例查询、该查询的
EXPLAIN和表结构。来自游戏的查询是否写入您正在运行查询的表?如果是这样,则可能是锁定问题。 -
我只是用这个简单的查询取出它:SELECT * FROM BlueBoxEngineDB.Transfer WHERE Amount = 1000 AND FromUserId = 4;
-
我读到了
SELECT *.. 第一期。你真的需要所有的列吗? -
严肃的回答:聘请一位非常优秀的 DBA。听起来您的问题远远超出了问答网站的范围。如果这是一项真正的业务,请获得优秀的员工。编辑:从头开始 - 只需让某人咨询一天或一周。
标签: mysql sql amazon-web-services mysql-workbench amazon-rds