在某些点

时间:2015-05-07 10:25:24

标签: mysql amazon-web-services go amazon-rds

我正在编写一个工作,通过一些MySQL表,根据一些critera选择一些行,从中提取电子邮件地址并向每个发送电子邮件。

过滤过程会查看一个表(让我们称之为storage),这个表非常大(转换为~6gb),看起来像这样:

Columns:
id      varchar(64) PK
path    varchar(64) PK
game    varchar(64)
guid    varchar(64)
value   varchar(512)
timestamp   timestamp

有两个指数:(id, path)(如上所见的PK)和guid

作业首先从一个表中检索一长串guid,然后批量处理它们并在storage表上执行这样的连续查询:

SELECT guid, timestamp FROM storage 
WHERE game = 'somegame' 
AND path = 'path' AND value = 'value' AND timestamp >= '2015-04-22 00:00:00.0' AND timestamp <= '2015-04-29T14:53:07+02:00' 
AND guid IN ( ... )

IN子句包含guid列表。

我需要检索时间戳才能进一步过滤。

当针对我的本地MySQL 运行时,一切都按预期工作,查询大约需要180毫秒,批量为1000个guid。

在Amazon RDS上运行相同的数据库时,查询会很快开始,但在某些时候,他们会突然开始大约30秒,然后继续这样做,直到作业结束。

我已经尝试了很多东西来解决这个问题,但无法弄清楚原因。一些说明:

  • 作业仅使用一个sql.DB对象。此外,我准备了上述声明一次并重复使用它。
  • 起初,我认为这是因为RDS DB运行MySQL 5.5,而我运行的是5.6。我制作了RDS DB的副本,升级到5.6,再次运行作业。问题再次发生。
  • 两个数据库中的数据量相同:我转储了生产数据库并将其导入我的本地数据库并运行了该作业。相同的行为(它仍在本地快速运行)。
  • RDS节点的AWS监控未显示任何重大峰值。 CPU使用率从1%上升到10%,而且工作似乎只打开几个连接(~4)。
  • 我有一位同事在他们的电脑上运行这个工作,指向我的 MySQL数据库,只是为了确保良好的性能不是源于连接本地的事实。它的运行速度与我的PC一样快(诚然,通过局域网)。
  • 我在本地PC 和 Amazon EC2节点上对RDS 运行了这项工作,这与RDS非常接近。从EC2开始,它表现得更好,但问题仍然存在。
  • 作业非常并发,每一步都有输入和输出通道(缓冲区大小为1000),工作由goroutines执行。在这两个步骤之间,我还有其他goroutine批量输出前一个goroutine。
  • 减速是突然的,一个查询需要几毫秒,而下一个需要几十秒。

我不知道为什么会这样。任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:0)

所以,经过大量的实验,我找到了解决方案。

我在所涉及的RDS实例上使用磁存储,这可以保证大约100 IOPS。这限制了我们查询数据的速度。

我使用2000 Provisioned IOPS进行了测试,工作一直很快。