如何修复 Amazon 上 mysql 的慢查询和小型 rds 实例上的 CPU 100%

如何修复 Amazon 上 mysql 的慢查询和小型 rds 实例上的 CPU 100%

我对 MySQL 和 AWS RDS 服务都很陌生。我发现在小型 RDS 实例上对 MySQL 的查询大约需要 5 秒以上。此外,我注意到 CloudWatch 的 rds 的 CPU 始终被 100% 占用。我的数据库大小现在约为 100 万。有人能告诉我该怎么做才能解决这个问题吗?

一个查询是这样的:

mysql> EXPLAIN SELECT * FROM iApps;
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows    | Extra |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------+
|  1 | SIMPLE      | iApps | ALL  | NULL          | NULL | NULL    | NULL | 1165255 |       |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------+
1 row in set (0.04 sec)

这是另一个查询:

mysql> EXPLAIN SELECT * FROM iApps WHERE familyName='Thompson' AND firstName='David';
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | iApps | ALL  | NULL          | NULL | NULL    | NULL | 1166070 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.08 sec)

这里的时间相当短,但是我的代码运行起来相当慢。我使用 python 包mysql数据库对于所有的操作来说,这可能是问题吗?

我确实在网上搜索过这个问题。但我并没有从这些页面上找到解决方案。我是数据库的入门级用户。

答案1

第二个查询的 EXPLAIN 计划暴露了这一点。您需要一个索引。

该条款WHERE familyName='Thompson' AND firstName='David'就是线索。

只需运行以下命令:

ALTER TABLE iApps ADD INDEX familyName_firstName_ndx (familyName,firstName);

我可以向你保证,这将加快这个特定查询的速度。具有不同WHERE子句的其他查询将需要不同的索引。

至于 CPU 峰值,这应该不足为奇。对 100 万行表进行全表扫描会将数据推送到 InnoDB 缓冲池中和从中推送数据。请记住,对于所有七种 RDS 模型,Amazon RDS 中的事务日志始终具有相同的大小(innodb_log_file_size = 128M)。通过您选择的相同行的事务也会对 CPU 使用率产生影响,因为它也会操纵事务日志。

相关内容