为什么我在 Amazon RDS for MySQL 中的查询运行缓慢?

2 分钟阅读
0

我正在尝试对 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 秒。

查询优化

如果从慢速查询日志或性能详情中识别出运行时间较长的查询,请考虑提高查询性能的方法。要调整查询,请考虑以下方法:

  • 要查找花费最多时间的状态,请分析慢速查询。有关更多信息,请参阅 MySQL 网站上的 SHOW PROFILE 语句
  • 运行 SHOW FULL PROCESSLIST 命令以及增强监控功能。同时使用这两者时,可以查看当前在数据库服务器上执行的操作列表。
  • 使用 SHOW ENGINE INNODB STATUS 命令获取有关事务处理、等待和死锁的信息。
  • 查找是否存在任何阻塞的查询并解决阻塞问题。有关更多信息,请参阅为什么在没有其他活动会话的情况下,对 Amazon RDS for MySQL 数据库实例的查询被阻止?
  • 将 MySQL 日志发布到 Amazon CloudWatch。日志每小时轮换一次,以保持分配的存储空间阈值的 2%。如果已超过两周,或者如果总大小超过阈值的 2%,则这些日志会被清除。
  • 设置 Amazon CloudWatch 警报,以便您可以监控资源使用情况,并在大小超出阈值时收到警报。
  • 查找查询的执行计划,并查看查询是否使用了适当的索引。您可以使用 EXPLAIN 计划优化查询,并查看有关 MySQL 如何运行查询的详细信息。
  • 使用 ANALYZE 表语句保持更新查询统计数据。由于统计数据过时,查询优化器有时会选择较差的执行计划。这可能会导致查询性能不佳,因为表和索引的基数估计值都不准确。
  • MySQL 8.0 现在使用的是 EXPLAIN ANALYZE 语句。EXPLAIN ANALYZE 语句是用于查询的分析工具,向您显示 MySQL 在哪个方面的查询花费时间以及原因。借助 EXPLAIN ANALYZE,MySQL 可以计划、衡量和运行查询,同时计算行数并测量在执行计划的各个点所花费的时间。查询完成后,EXPLAIN ANALYZE 将打印计划及其测量值,而不是查询结果。
  • 在 MySQL 版本 8 中,请注意,data_lock_waits 表的“性能架构”中列出了锁定等待。例如:
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 利用率高的问题,如何排查并解决?

AWS 官方
AWS 官方已更新 2 年前