Ruby on rails:ActiveRecords' first_or_create非常慢

时间:2017-08-29 13:59:25

标签: mysql ruby-on-rails ruby rails-activerecord

我有一个ruby脚本,可以将XML文件导入MySQL数据库。它通过循环遍历XML文件中的元素并最终

来实现
table.where(
          value:  e['value'],
          ...
      ).first_or_create

脚本必须处理大量数据,其中大部分已经存在于数据库中。因此,它运行速度非常慢,因为first_or_create显然会触发很多SELECT查询。

有没有办法更迅速地处理这个问题?它与连接管理有关吗?

由于

2 个答案:

答案 0 :(得分:0)

first_or_create当然是一种方便的方法,它不关心更大数据集的性能。

确保所有指数都到位。

提高性能的第一个显而易见的方法是:因为每个create语句都包含在begincommit事务块中。这是一个插入的3个查询。 您可以将整个循环置于transaction块内 - 这样可以获得一些时间,因为它只会执行begincommit一次。

请记住,往返数据库的往返需要相当长的时间,因此明显的性能提升是将多个语句合并为一个。尝试创建一个SELECT查询,查找一批,比方说1000条记录。 DB将返回200不存在,您可以继续为这200个查询构建一个INSERT语句。

始终执行测量并始终尝试制定您尝试达到的性能水平,以免使代码过于冗长。

答案 1 :(得分:0)

最好删除需要create.check记录的记录,如果不在db中则创建