【问题标题】:Ruby on rails: ActiveRecords' first_or_create is very slowRuby on rails:ActiveRecord 的 first_or_create 非常慢
【发布时间】:2018-02-07 00:39:32
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • XML 文件是否可以多次包含相同的元素?
  • 您通过上面的where 命令生成的子句是否有索引?

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


【解决方案1】:

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

确保所有索引都到位。

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

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

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

【讨论】:

    【解决方案2】:

    需要创建的记录最好去掉。如果db中没有的则检查记录再创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-29
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多