首页 > 解决方案 > 如何诊断极慢的 AWS RDS MySQL 性能?

问题描述

我的数据库有大约 15 个表,每个表有 40 列,每个表有 10.000 行。其中大部分带有 VARCHAR、一些索引和外键。

有时我需要重建我的数据库(设计缺陷,正在处理它),这在本地需要大约 40 秒。现在我正在尝试对 AWS RDS MySQL 5.75 实例执行相同的操作,但这需要很长时间,大约需要 40-50 分钟。上一次我不得不做同样的过程不超过 5 分钟,仍然比本地的 40 秒多,但我很满意。

我的互联网速度约为 35 Mbps 下载 / 5 Mbps 上传。我知道它并不快,但它是一致的,并且自从我上次重建以来它没有改变。

我启用了常规日志,但我只能看到 INSERT 查询,偶尔会看到一些“SELECT 1”。我确实有相同的空间来改进我的代码,但是从 00:40:00 到 50:00:00,似乎还有其他事情发生。

关于如何诊断和找到瓶颈的任何想法?谢谢

--

附加相关信息:它是来自 AWS 的 Micro 实例,所有相关监控指标基本持平:CPU 在 4%,Free Storage Space 在 20.000 MB,Freeable Memory 在 200 MB,Write IOPS 在 2,5 左右,服务器运行 5.7.25 MySQL、1vCPU、1Gb RAM 和 20GB SSD。这与 3 个月前我上次重建数据库时的情况相同。

SHOW GLOBAL STATUS: https://pastebin.com/jSrAzYZP SHOW GLOBAL VARIABLES : https://pastebin.com/YxD7dVhR SHOW ENGINE INNODB STATUS : https://pastebin.com/r5wffB5t SHOW PROCESS LIST : https://pastebin.com/kWwiyGwf SELECT * FROM information_schema... : https://pastebin.com/eXGBmetP

max_allowed_packets除了启用日志、e 最大化和将日志保存到文件之外,我没有对服务器配置进行任何重大更改。

在我的后端,我有一个 Flask 应用程序正在运行,当它接收到 API 调用时,它需要一堆腌制对象并将它们全部添加到数据库中(将 Flask SQLAlchemy 类附加到列表中)然后运行db.session.add_all(entries),尝试运行批量手术。localhost对于和我的远程服务器,代码都是相同的。

在三个特定表中它确实变慢了,其中大多数都有 VARCHAR 列,但与我上次插入的没有什么不同 - 问题似乎是数据,或者代码的结构方式,或者至少看起来不合理这将导致 20 秒(本地主机)到 40 分钟(托管服务器)的时间,特别是当其余表的工作方式基本相同时。

标签: mysqlamazon-web-services

解决方案


启用慢日志,设置 long_query_time=0,运行您的代码,然后将生成的日志放入 mysqldumpslow。

确定哪些查询对速度的影响最大,并从那里获取。

比较旧服务器和新服务器之间的配置。

另外,它们是相同版本的 MySQL 吗?5.6、5.7 和 8.0 可以产生非常不同的执行计划(如果它们不同,5.6 通常会提出合理的计划)。


推荐阅读