我对 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 使用率产生影响,因为它也会操纵事务日志。