我们最近注意到在慢速查询日志中每分钟有更多的记录(大约每分钟的第0秒)。这似乎与我们的任何cronjob都没有关系,所以我决定在一个新的RDS t3上做一个快速测试。微实例MySQL 8.0.23.
以下是复制的步骤:创建表:
CREATE TABLE `_test` ( `date` datetime NOT NULL, `val` int NOT NULL DEFAULT '1' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; COMMIT;
进行100,000次插入(重要:对每一行使用单个查询,不要用一个查询插入多行),如:
INSERT INTO `_test` (`date`, `val`) VALUES (NOW(), '1'); INSERT INTO `_test` (`date`, `val`) VALUES (NOW(), '1'); INSERT INTO `_test` (`date`, `val`) VALUES (NOW(), '1'); ...
执行如下查询:
SELECT SUBSTRING(`date`, -2, 2) AS `second`, AVG(`count`) AS `avg` FROM ( SELECT `date`, COUNT(1) AS `count` FROM `_test` GROUP BY `date` ) AS `temp` GROUP BY `second` ORDER BY `avg` ASC
结果如下:
(尚未完整答案)
这些是奇怪的查询:
SELECT count(*)
FROM mysql.rds_history
WHERE action = 'disable set master'
GROUP BY action_timestamp, called_by_user, action, mysql_version,
master_host, master_port, master_user, master_log_file,
master_log_pos, master_ssl
ORDER BY action_timestamp
LIMIT 1
SELECT count(*)
FROM mysql.rds_replication_status
WHERE master_host IS NOT NULL
AND master_port IS NOT NULL
GROUP BY action_timestamp, called_by_user, action, mysql_version,
master_host, master_port
ORDER BY action_timestamp
LIMIT 1
没有任何其他列的COUNT(*)
,加上GROUP BY
,ORDER BY
和LIMIT
的组合,在我看来是无意义的。
由于RDS使用块存储(EBS),因此对RDS数据库的更改受到所选存储的IOPS的限制。一般用途的SSD存储每GB有3 IOPS,所以你有60 IOPS的限制,例如20 GB。现在,如果您使用的IOPS超过规定的60 IOPS,您将在每分钟结束时(或新分钟开始时)遇到延迟。
<<p>解决方案/strong>:要么增加存储(注意,普通SSD [gp2]的吞吐量不超过250 MiB/s,因此即使增加到333gb以上,IOPS也只能达到1000 IOPS),要么选择IOPS更高的IOPS-SSD存储