![如何修复 Amazon 上 mysql 的慢查询和小型 rds 实例上的 CPU 100%](https://linux22.com/image/605359/%E5%A6%82%E4%BD%95%E4%BF%AE%E5%A4%8D%20Amazon%20%E4%B8%8A%20mysql%20%E7%9A%84%E6%85%A2%E6%9F%A5%E8%AF%A2%E5%92%8C%E5%B0%8F%E5%9E%8B%20rds%20%E5%AE%9E%E4%BE%8B%E4%B8%8A%E7%9A%84%20CPU%20100%25%20.png)
我对 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 使用率产生影响,因为它也会操纵事务日志。