Amazon RDS -每分钟变化的查询速度很慢



我们最近注意到在慢速查询日志中每分钟有更多的记录(大约每分钟的第0秒)。这似乎与我们的任何cronjob都没有关系,所以我决定在一个新的RDS t3上做一个快速测试。微实例MySQL 8.0.23.

以下是复制的步骤:
  1. 创建表:

    CREATE TABLE `_test` (
    `date` datetime NOT NULL,
    `val` int NOT NULL DEFAULT '1'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    COMMIT;
    
  2. 进行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');
    ...
    
  3. 执行如下查询:

    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
    

结果如下:

<表类>第二avgtbody><<tr>0020.193534道明>0151.16132652.66670252.90325053.53332053.66675953.718830道明>06年54.16133654.16672754.33330554.51615254.77420455.096835道明>15道明>07年56.00003856.00001956.10004956.13331156.13332956.16674556.200003号56.2258

(尚未完整答案)

这些是奇怪的查询:

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 BYLIMIT的组合,在我看来是无意义的。

由于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存储

最新更新