2

我们有一个 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
4

3 回答 3

1

您可能需要调整架构(添加索引是直接步骤)。

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

您可能应该考虑将一些表卸载到DynamoDBRedis。它们都将给出个位数毫秒的延迟,因此在游戏开发人员中非常受欢迎。你只需要考虑你的数据结构

于 2012-11-30T11:09:39.693 回答
1

上的索引(FromUserId, Amount, Status)可能会对这个查询有很大帮助。

您可能有更多的查询变体命中此表。为它们中的每一个添加一个索引,最终会使您在表中拥有数十个索引,这可能会带来其他问题。

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

于 2012-11-30T11:33:53.217 回答
1

你真的应该考虑运行一个高可用性 RDS 并设置一个只读副本。这样,您就可以在副本上运行复杂的查询来满足您的需求,而不会干扰生产数据库。

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

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

于 2012-11-30T01:59:04.257 回答