![为什么数据库查询在 AWS RDS 上运行速度如此之慢?](https://linux22.com/image/740022/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9F%A5%E8%AF%A2%E5%9C%A8%20AWS%20RDS%20%E4%B8%8A%E8%BF%90%E8%A1%8C%E9%80%9F%E5%BA%A6%E5%A6%82%E6%AD%A4%E4%B9%8B%E6%85%A2%EF%BC%9F.png)
我一直在研究性能敏感的功能。我一直在本地开发,在我的 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