我对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包mysqldb进行所有的操作,这可能是问题吗?
我在网上search这个问题。 但是我并没有真正从网页上获得解决scheme。 我是数据库的入门级。
第二个查询的EXPLAIN计划将其提供。 你需要一个索引。
WHERE familyName='Thompson' AND firstName='David'是线索。
只需运行以下内容:
ALTER TABLE iApps ADD INDEX familyName_firstName_ndx (familyName,firstName);
我可以向你保证,这将加快这个特定的查询。 其他具有不同WHERE子句的查询将需要不同的索引。
至于CPU秒杀,这应该不会是一个惊喜。 在一百万行的表上进行全表扫描会将数据推入和移出InnoDB缓冲池。 请记住,所有七个RDS模型的Amazon RDS中的事务日志总是相同的大小(innodb_log_file_size = 128M)。 正在通过相同的行传递的transacitons也会影响CPU使用率,因为它也处理事务日志。