我在 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,这些查询每个花费的时间 < 50 毫秒。但是在其他一些页面中,我们遇到了较旧的 id,这些查询的延迟飙升至 500 毫秒、800 毫秒,最多 1.5 秒。
我做了一个测试,在 Mysql 重新启动后,我做了一个SELECT id FROM TableB
强制索引到缓存/内存中。Table B
查询仍然很慢。然后我做了一个SELECT * FROM TableB
。现在有了缓存/内存中的整个表,查询变得非常快(<50ms)。
我的问题:> 500 毫秒,> 1000 毫秒对于仅通过 PRIMARY KEY 检索行的查询来说是合理的延迟?即使在 42M 的表中?即使所有行都在磁盘中?对我来说似乎太多了。
将 MySQL 数据移动到临时存储 (/mnt) 会改善这一点吗?使用预置 IOPS 会有所帮助吗?