我正在尝试对 Amazon Relational Database Service (Amazon RDS) for MySQL 中的查询运行缓慢问题进行故障排除。为什么会发生这种情况?如何提高查询性能?
简短描述
要提高查询性能,请考虑以下因素:
- 资源利用率(例如 CPU、内存和存储)
- 工作负载分析
- 查询优化和监控
解决方法
资源利用率(例如 CPU、内存和存储)
要了解导致任何数据库性能问题的根本原因,请检查实例正在使用的所有服务器范围内的资源。您可以监控工作负载,并调查与查询开始运行时间过长的时间相比,查询性能在何时是正常的。
使用 Amazon CloudWatch 指标监控一段时间内de 这些资源,包括性能正常的天数。您还可以在 Amazon RDS 控制台中查看性能指标,来监控数据库性能。
您还可以检查实例状态,以确定可能影响数据库性能的任何其他活动或计划流程。在 Amazon RDS 控制台中,查看数据库性能不佳时发生的事件。
工作负载分析
要分析导致资源消耗的工作负载,请使用性能详情。性能详情将分析导致资源消耗增加的所有查询以及所有等待时间,并以图形方式呈现。
性能详情使用工作负载作为其主要指标,而不是使用实例的 vCPUs 数量。如果您当前的工作负载超过 vCPU 限制,则服务器会过载。如果服务器过载,请检查导致增加工作负载的查询,并确定优化查询的方法。然后,考虑修改您的实例类。
您的性能详情工作负载也可以细分为等待事件。通过将数据库负载按等待事件的数量进行切片,调查最耗资源的等待事件。负载图表中较粗的色带表示导致工作负载增加量最多的等待类型。有关更多信息,请参阅使用 Amazon RDS 上的“性能详情”监控数据库负载。
您还可以使用慢速查询日志(在自定义参数组中启用)来识别运行缓慢的查询。
然后,您可以使用 Amazon CloudWatch 指标来查看实例上完成的工作量是否增加。例如:
- 数据库连接:连接到数据库实例的客户端会话数。
- 网络接收吞吐量(MB/秒):进出数据库实例的网络流量速率。
- 写入和读取吞吐量:每秒从磁盘读取或写入磁盘的平均兆字节数。
- 写入和读取延迟:读取或写入操作的平均时间(以毫秒为单位)。
- IOPS(读取和写入):每秒平均磁盘读取或写入操作次数。
- 可用存储空间(MB):数据库实例当前未使用的磁盘空间量。
延迟指标表示完成读取或写入磁盘 I/O 操作所花费的时间。延迟指标与增加的数据库连接或吞吐量指标之间的关联,可能表明工作负载是查询执行缓慢的原因所在。有关识别使用量因素的更多信息,请参阅如何查看运行 MySQL 的 Amazon RDS 数据库实例中的存储使用情况?
您还可以使用增强监控来检索工作负载中涉及的操作系统列表和底层系统指标。默认情况下,增强监控的监控间隔时间为 60 秒。对于获取更精细的数据点,最佳实践是将此间隔时间设置为 1-5 秒。
查询优化
如果从慢速查询日志或性能详情中识别出运行时间较长的查询,请考虑提高查询性能的方法。要调整查询,请考虑以下方法:
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
ON r.trx_id = w.requesting_engine_transaction_id;
有关更多信息,请参阅 MySQL 网站上的使用 InnoDB 事务和锁定信息。
相关信息
Tuning Amazon RDS for MySQL with Performance Insights
我的 Amazon RDS for MySQL、MariaDB 或 Aurora for MySQL 实例存在 CPU 利用率高的问题,如何排查并解决?