【发布时间】:2012-07-15 06:08:52
【问题描述】:
我正在使用 DoctrineExtensions 来管理嵌套树(嵌套树行为)。我必须从 csv 文件中导入 10-20K 记录并将它们存储在数据库中。
我为此任务创建了一个服务,它创建了一堆新的类别(树节点),设置这些类别的父级并将它们持久化,最后我调用 EntityManager#flush 方法将创建的类别保存到数据库中。
按照我的逻辑,流程应该是这样的:
- 扩展计算每个节点(右、左、水平等)所需的数据
-
Doctrine 会在其中插入所有数据进行查询,类似于:
INSERT INTO table (field1, field2, parent_id, root, left, ...) VALUES (fields of 1st record), (fields of 2st record), ...
然而,Doctrine 会分别插入每条记录,此外,根、左和右值在刷新期间会更新,导致需要大量更新查询。
为了插入 70 个类别,我需要大约 250 个查询,当我想添加 500 个类别时,程序由于内存不足而终止。
如何优化流程?当然我可以从头开始编写它,但我真的很想使用这个出色的扩展。
【问题讨论】:
-
是否有可能,您是否尝试拆分导入,在结束前调用flush。 (即:首先加载 20,刷新(sql 查询......),然后加载 20,刷新等)
-
不幸的是,它没有产生任何影响,并且请求的数量相同。
-
另外,请注意,当您
flush()实体管理器时,学说将进入事务模式,执行所有请求然后提交。因此,即使有很多查询,性能影响也比您想象的要小。但是,如果您真的需要更好的性能,请使用原始 sql ... :/ -
我并不关心查询的数量,只要它相对较快。我想说,对于导入 15000 条记录,最佳时间应该是
-
@DavidFrank 用您的解决方案发布答案,然后接受它而不是在问题中发布解决方案 :)
标签: php mysql symfony tree doctrine-orm