由于COUNT查询导致的Amazon RDS CPU利用率

时间:2013-04-17 07:49:58

标签: mysql cpu cpu-usage rds

我在亚马逊EC2(新加坡地区)上发布了我的网站,我在同一地区使用了MySQL RDS媒体实例进行数据存储。

就我而言,大多数选择查询都有一些COUNT功能。这些查询显示非常慢的结果。我已经在表上创建了适当的索引,并检查了EXPLAIN命令以分析这些查询。它告诉我,全表扫描是获得结果所必需的。

在我的RDS媒体实例上,我已使用以下设置配置自定义参数组。

log_queries_not_using_index = true,
slow_query_log = true,
long_query_time = 2 sec,
max_connections = 303,
innodb_buffer_pool_size = {DBInstanceClassMemory*3/4}

昨天我的CPU利用率超过95%,我的网站因此而崩溃。流量没有大幅增加。

此外,我将数据转储到本地系统,并测试了其中一个COUNT个查询。虽然它在RDS上运行大约需要1.5秒,但它在我的本地系统上运行只需要大约400毫秒。我本地系统上的配置(4GB RAM,Intel core 2 duo 2.8GHz)是:

max_connections = 100,
slow_query_log = true,
long_query_time = 2 sec,
innodb_buffer_pool_size = 72351744

那么,什么是CPU利用率飙升以及RDS和本地系统之间性能时间差异的原因是什么?

谢谢,

1 个答案:

答案 0 :(得分:1)

根据表大小 - RDS实例使用EBS存储数据 - 如果您正在进行表扫描,并且必须从EBS而不是本地缓存的内存中获取数据,然后扫描它。所以 - 您可能会看到CPU所在的RDS实例与SAN中的EBS数据之间的网络延迟增加。当您在本地计算机上执行相同的查询时,唯一的延迟是磁盘头搜索时间。

然后CPU时间之间存在差异 - m1.medium比基于亚马逊EC2单位定义的core2二重奏具有更少的CPU时间(因此扫描结果的机会更少)。

HTH - 一般情况下,我会尽量避免在查询中执行COUNT,因为这是一个非常低效的查询(正如您所见),当数据库是DB时,它会继续导致令人讨厌的不良结果在实时不同的负载水平下。

[R