【发布时间】:2013-01-28 04:09:24
【问题描述】:
我在 AWS 上有一个 MySQL m2.2xlarge 实例。 MySQL 数据目录位于根 EBS / 中。它是单个 EBS 而不是 RAID。我们有三个主要的表。其中一个Table C,内容最大,仅用于最后几天的数据。这些表中的插入率约为每天 80.000 行。这 3 个表有大约 4200 万行。 innodb_buffer_pool_size 有大约 30GB 的实例 RAM。
Table A是最重要的,它的数据长度是~33GB,索引~11GB
Table B 的数据长度约为 8GB,索引约为 5GB
在我们的网站中,两个主要查询(延迟方面)如下所示:
SELECT * FROM TableA WHERE id in (.....)
SELECT * FROM TableB JOIN .... WHERE id in (.....)
在大多数页面中,(...) 将是大约 50 个最近的 id,这些查询每个耗时
我做了一个测试,在 Mysql 重新启动后,我做了一个SELECT id FROM TableB 来强制索引到缓存/内存。 Table B 查询仍然很慢。然后我做了一个SELECT * FROM TableB。现在有了缓存/内存中的整个表,查询变得非常快(
我的问题:> 500 毫秒,> 1000 毫秒对于仅通过 PRIMARY KEY 检索行的查询来说是合理的延迟?即使在 42M 的表中?即使所有行都在磁盘中?这对我来说似乎太多了。
将 MySQL 数据移动到临时存储 (/mnt) 会改善这一点吗?使用预置 IOPS 会有帮助吗?
【问题讨论】:
-
您使用的是单个 EBS 卷还是 RAID 集?如果没有可靠的复制,使用 /mnt 可能会有些风险。您可以测试预置的 IOPS,而无需自己承担太多成本。
-
单个 EBS。我想如果不将整个数据集转储到新的 EBS 卷,我就无法转移到预置的 IOPS。所以我想先了解一些知识是否值得搬家。
-
我认为您可以对您的卷进行 snapshop 并从 snapshop 中创建一个带有预置 IO 的新卷。然后将其附加到一个新实例以对其进行测试。 ec2 的好处是可以灵活地配置新实例来测试性能变化,而无需提交。
标签: mysql amazon-web-services amazon-ec2