【问题标题】:How to make this tree generation faster(doctrine2+extension)?如何使这棵树的生成更快(doctrine2+extension)?
【发布时间】:2012-07-15 06:08:52
【问题描述】:

我正在使用 DoctrineExtensions 来管理嵌套树(嵌套树行为)。我必须从 csv 文件中导入 10-20K 记录并将它们存储在数据库中。

我为此任务创建了一个服务,它创建了一堆新的类别(树节点),设置这些类别的父级并将它们持久化,最后我调用 EntityManager#flush 方法将创建的类别保存到数据库中。

按照我的逻辑,流程应该是这样的:

  1. 扩展计算每个节点(右、左、水平等)所需的数据
  2. 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


【解决方案1】:

我的解决方案是使用物化路径树而不是嵌套树。我知道,这不是这个问题的真正解决方案,但它可以有效地工作。如果您有更好的解决方案,请发布,我可能会接受它作为解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多