为什么数据库查询在 AWS RDS 上运行速度如此之慢?

为什么数据库查询在 AWS RDS 上运行速度如此之慢?

我一直在研究性能敏感的功能。我一直在本地开发,在我的 Mac 上运行 MySQL 服务器。一个关键查询在我的计算机上运行大约 1.2 秒,这对我来说是可以接受的。一切都运行得足够快,所以我决定将其移到 AWS RDS Aurora 数据库上,这样我就可以开始在生产中使用新系统了。

但是,一旦我开始连接到 RDS 而不是本地服务器,查询所需的时间就开始增加一倍以上。这是比较实际查询运行所需的时间,不受网络速度的影响。这就是我的测量方法。

我将 RDS 使用的实例升级为db.r3.4xlarge,它有 122 GB 的 RAM、Intel Xeon E5-2670 v2 (Ivy Bridge) 和 16 个 vCPU。我的本地机器有 32 GB 的 RAM 和 4 GHz Intel Core i7。

我对这些不太了解,但无论你看什么指标,云中的数据库似乎都在更强大的硬件上运行。

主要问题:我还能研究什么来使云数据库像本地机器一样快速运行?

看似合理但实际上并非如此的原因如下:

  • explain在查询开始时使用会导致两个数据库上出现完全相同的索引计划。
  • 由于我向其中加载的数据较少,因此在 AWS 上运行的数据库的行数比本地数据库少。
  • 除非我忽略了某些东西,否则云中的硬件比我的本地机器更强大。
  • 网络性能不属于我所衡量的范围。
  • 它并不局限于某个特定的查询——几乎每个查询的运行速度都慢了 2 到 3 倍。
  • 我正在比较仅运行简单的查询,因此我的应用程序代码不包括在其中。

可能成为因素但我真的不知道的事情:

  • AWS 数据库正在运行模仿 MySQL 5.6.10 的 Aurora,而我在本地运行的是 MySQL 5.6.43。
  • 也许除了 RAM 或 CPU 之外,我的计算机的另一个芯片或组件也影响了这一点。
  • 云端还能建立索引吗?我认为 MySQL 索引是在插入数据时建立的。

我真的有点不知所措。如果有人有任何想法或建议,我将不胜感激!

答案1

我采纳了评论中 Tim 的建议,注册了 AWS Support,这样我就可以和别人聊聊这个问题。解释如下:

Aurora 是为高度并发工作负载而构建和定制的,单线程不太可能产生令人印象深刻的结果,因为基准测试中的并发级别也需要验证。

因此,如果我们正在进行 1 个查询,Aurora 的执行速度不太可能与本地机器一样快

经过一番反复讨论,我使用 RDS MySQL 代替 Aurora 重试,成功了!速度几乎与我的本地机器一样快,而且硬件便宜得多。

答案2

就我而言,我注意到数据库索引未迁移到 RDS。我添加了索引,它运行得很快。此外,MySQL 查询缓存在 RDS 中默认处于关闭状态。这不会提高初始查询的性能,但总体上可能会加快速度。您可以设置query_cache_type为 1 并定义一个值query_cache_size。我还将thread_cache_size从 8 更改为 24,innodb_io_capacity从 200 更改为 1900,不知道这是否对您有帮助。(添加索引后我关闭了查询缓存) 此外,创建 AWS DB 参数组也为我配置和调整 DB 变量提供了很大帮助。您可以在此处阅读更多信息: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

相关内容