我有一个将XML文件导入MySQL数据库的ruby脚本。它通过循环遍历XML文件中的元素并最终实现
table.where(
value: e['value'],
...
).first_or_create
该脚本必须处理大量数据,其中大多数已经在数据库中。因此,它的运行速度非常慢,因为first_or_create显然会触发很多SELECT查询。
有什么办法可以更快地处理这个问题?与连接管理有关吗?
谢谢
最佳答案
first_or_create
当然是一种便捷的方法,它并不关心较大数据集的性能。
确保所有索引均已就绪。
第一个明显的提高性能的方法是:由于每个create语句都包装在begin
,commit
事务块中。多数民众赞成3查询一个插入。
您可以将整个循环放在transaction
块中-这将为您节省一些时间,因为它只会执行begin
和commit
一次。
请记住,往返数据库的往返时间要花费大量时间,因此明显的性能提升是将多个语句组合为一个语句。尝试创建一个SELECT
查询以查找一批,比如说1000条记录。 DB会返回200个不存在的数据,您可以继续为这200个查询建立一个INSERT
语句。
始终执行测量,并始终尝试制定要达到的性能水平,以免使代码过于冗长。
关于mysql - Ruby on Rails:ActiveRecord的first_or_create非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45941091/