我有一个ruby脚本,可以将XML文件导入MySQL数据库。它通过循环遍历XML文件中的元素并最终
来实现table.where(
value: e['value'],
...
).first_or_create
脚本必须处理大量数据,其中大部分已经存在于数据库中。因此,它运行速度非常慢,因为first_or_create显然会触发很多SELECT查询。
有没有办法更迅速地处理这个问题?它与连接管理有关吗?
由于
答案 0 :(得分:0)
first_or_create
当然是一种方便的方法,它不关心更大数据集的性能。
确保所有指数都到位。
提高性能的第一个显而易见的方法是:因为每个create语句都包含在begin
,commit
事务块中。这是一个插入的3个查询。
您可以将整个循环置于transaction
块内 - 这样可以获得一些时间,因为它只会执行begin
和commit
一次。
请记住,往返数据库的往返需要相当长的时间,因此明显的性能提升是将多个语句合并为一个。尝试创建一个SELECT
查询,查找一批,比方说1000条记录。 DB将返回200不存在,您可以继续为这200个查询构建一个INSERT
语句。
始终执行测量并始终尝试制定您尝试达到的性能水平,以免使代码过于冗长。
答案 1 :(得分:0)
最好删除需要create.check记录的记录,如果不在db中则创建