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

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


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

有什么办法可以更快地处理这个问题?与连接管理有关吗?

谢谢

最佳答案

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

确保所有索引均已就绪。

第一个明显的提高性能的方法是:由于每个create语句都包装在begincommit事务块中。多数民众赞成3查询一个插入。
您可以将整个循环放在transaction块中-这将为您节省一些时间,因为它只会执行begincommit一次。

请记住,往返数据库的往返时间要花费大量时间,因此明显的性能提升是将多个语句组合为一个语句。尝试创建一个SELECT查询以查找一批,比如说1000条记录。 DB会返回200个不存在的数据,您可以继续为这200个查询建立一个INSERT语句。

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

关于mysql - Ruby on Rails:ActiveRecord的first_or_create非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45941091/

10-09 02:07