Mysql 在Postgres迁移后,Rails写入所需的时间延长了100%

Mysql 在Postgres迁移后,Rails写入所需的时间延长了100%,mysql,ruby-on-rails,postgresql,Mysql,Ruby On Rails,Postgresql,我正在一个大型Rails应用程序上进行从MySQL到Postgres的迁移,大多数操作都以正常速率执行。但是,我们有一个特定的操作,大约每30分钟生成一次作业记录。通常会生成并插入大约200条记录,之后我们会有单独的工作人员从另一台服务器接收作业并处理它们 在MySQL下,生成记录大约需要15秒,然后再花3分钟让工作人员执行并写回结果,一次一个(因此对原始工作记录再更新200次) 在Postgres中,工作人员需要大约30秒,然后再花7分钟来执行并写回结果 正在写入的表大约有200万行,ID下有

我正在一个大型Rails应用程序上进行从MySQL到Postgres的迁移,大多数操作都以正常速率执行。但是,我们有一个特定的操作,大约每30分钟生成一次作业记录。通常会生成并插入大约200条记录,之后我们会有单独的工作人员从另一台服务器接收作业并处理它们

在MySQL下,生成记录大约需要15秒,然后再花3分钟让工作人员执行并写回结果,一次一个(因此对原始工作记录再更新200次)

在Postgres中,工作人员需要大约30秒,然后再花7分钟来执行并写回结果

正在写入的表大约有200万行,ID下有一个序列列

我尝试过调整检查点的超时时间和大小,但运气不佳

该表被大量索引,实际上不应该与以前有任何不同

我不能发布代码示例,因为它是一个庞大的代码库,如果不发布一页又一页的代码,它就没有意义

我的问题是,有人能想到为什么会发生这种情况吗?Postgres日志中没有任何内容,创建这些对象的过程实际上没有改变。在Postgres中是否存在某种我不知道的阻塞同步写入行为

我在我的代码中添加了各种各样的日志记录来发现错误或事务失败,但我什么也没想到,它只需要运行两倍的时间,这在我看来是不正确的

Postgres实例以M3.Medium实例类型托管在AWS RDS上


我们还使用了New Relic,这里没有显示任何有趣的内容,这令人惊讶

为什么您的作业队列包含200万行?它们都是活动的还是没有将它们移动到存档表以使您的报告更简单

您是否使用过psql提示符或首选的SQL IDE/工具对SQL进行解释

Postgres是与MySQL完全不同的RDBMS。它以不同的方式分配空间和操作空间,因此可能需要以不同的方式编制索引

此外,还有一个名为pgtune的工具,可以建议配置更改


编辑:2014-08-13

此外,这可能会增加一些洞察力。这是一个例子


您还希望在磁盘IO级别监视DB服务器。您的工作完成是否需要大量更新?Postgres会在更新现有行时创建新行,并将旧行标记为可用,而不仅仅是覆盖现有行。因此,由于您的RDBMS切换,您可能会看到更多的IO。

如果您无法提供(1)队列是什么,(2)如何创建作业或(3)工人做什么的详细信息,究竟谁能分辨出什么是不同的呢?工作人员执行本地系统任务,并在更新单个记录时简单地使用作业信息进行返回API调用。调度程序每小时创建一次作业,点击一个控制器方法,计算一组动态任务,并以“挂起”状态插入到表中。工作人员通过API调用获取这些数据。我怀疑是否有人能给我一个答案,但我想了解一些关于在这种情况下使用Postgres的建议或方向。有人提到索引在Postgres上的工作方式不同?您是否尝试过调整Postgres(通过编辑Postgres.conf)?初始设置非常低。此外,如果您使用MySQL ISAM表,Postgres的速度会慢一些,因为它提供了MySQL ISAM表所没有的一些功能。是的,iv调整了检查点超时和检查点段大小,似乎没有什么帮助。我们的MySQL数据库都是InnoDB。它们都在AWS RDS上运行,所以AWS应该已经对其进行了调整,以达到一定的下降量。我希望它会稍微慢一点,但不是100%慢一点。不幸的是,这是一个大问题。200万行大约是1个月的数据,这是应用程序中使用所必需的,我们会在这之后存档。我很想知道更多关于当你说它需要不同的索引,虽然?你是什么意思?我会查看pgtune,谢谢你使用解释[psql中的命令,让psql告诉您它计划如何执行您的查询。如果您看到大量顺序扫描,您可能希望以不同的方式索引您的数据。您是说您今天的应用程序的某些部分将需要使用三周前的工作队列中的数据吗?正确。工作状态信息与其他信息混合,并按alo趋势显示ng事件时间表和图表。(工作状态不好表示系统不健康),因此我们提前一个月按需使用非常重要。好的。我现在回到解释工作记录生成和履行的每个步骤。这是了解数据库瓶颈所在的唯一实际方法。