本地数据库与Heroku Postgres速度比较

4
我有一个本地数据库,其中只有一个表格,大约有550万条记录。我在Heroku Postgres上创建了一个新的数据库(基础计划),并将本地转储文件还原到其中。打开psql并执行一些查询后,我发现速度明显比本地慢。然后,我又根据起重机计划提供了另一个数据库,但数字同样糟糕。
以下是一些数字:
选择从表中计数(*);
本地:1216.744毫秒
Heroku(基本):4697.073毫秒
Heroku(Crane):2972.302毫秒
选择列从表中,其中id = 123456;
本地:0.249毫秒
Heroku(基本):127.557毫秒
Heroku(Crane):137.617毫秒
这些巨大的差异如何可能?是否完全与硬件差异有关?是否有任何简单的方法可以增加吞吐量?

如果您在通过ssh连接到服务器后执行查询,则可能存在问题;如果您从本地使用psql客户端,则网络可能是主要原因。 - abhirathore2006
3个回答

6
单行选择需要120-130毫秒,这很可能是网络延迟的表现,正如Lukos所建议的那样,您可以通过在靠近数据库服务器的位置运行查询来减少这种延迟。然而,2-3秒的延迟更可能与数据库速度有关--具体来说,是I/O吞吐量。这就是为什么Heroku强调他们的数据库提供的差异与缓存大小有关。

Heroku Postgres将您的数据存储在Amazon EBS上。(这在一份事故报告中有所透露,顺便解释了1 TB的限制。)EBS的性能有点像过山车;比本地磁盘要复杂得多。有些读取可能很快,有些可能很慢。有时整个卷会降至100 KB/s,有时它会达到互连的最大值。
在我的EC2数据库托管经验中,我发现在EBS上运行RAID 10可以平衡性能差异。我认为Heroku没有这样做,因为它会大大增加超出数据库计划价格点的成本。AWS最近宣布了EBS的预配置IOPS,这将允许您支付专用容量,进一步增加可预测性,但也会增加成本。

3

所以您想知道在线数据库服务是否可能比本地数据库慢?是的,当然会更慢,因为需要处理所有的网络延迟。
有没有简单的方法可以加快速度?除了像更快的网络连接和将办公室搬到靠近Heroku数据中心之类的显而易见的方法之外,没有。


1
所以上面的时间包括网络延迟,因此是不正确的。使用explain analyze可以在服务器上获得执行时间,这些数字与本地执行时间相当。谢谢! - fphilipe

0
我在 Heroku Postgres 上创建了一个新的数据库(基本计划),并将本地转储文件还原到其中。 看起来您同时在使用不同的数据库。
select column from table where id = 123456;
Local: 0.249 ms
Heroku (Basic): 127.557 ms
Heroku (Crane): 137.617 ms

我强烈怀疑您的Heroku应用程序和Heroku数据库没有托管在同一地区。两者都必须位于美国或欧洲。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接