加速推进嵌套集插入构建大型树


Speed up Propel nested-set inserts building large tree

我使用Propel 1.6.7-dev,并在嵌套集中维护两个树(每个树都有不同的作用域列)。目前,我们每套大约有2万个项目(总共约4万个记录)。

我可以随意重建数据库,并定期进行(以处理某些大型树更改)。

现在,这需要大约50米左右的时间才能完成,我想知道如何才能加快速度(如果规模翻倍,定期重建的时间可能会变得太长)。

现在,我是:

  • clearInstancePool()
  • 属性::disableInstancePooling()
  • beginTransaction()
  • (将所有项目重新插入2棵树的代码)
  • commit()
  • enableInstancePooling()

我尝试过将引擎从MyISAM更改为MEMORY,构建树,然后转换回MyISAM。然而,我的内存用完了:

PHP致命错误:允许的内存大小134217728字节已用尽(试图分配72字节),位于第433 行的vendor/powell/runtime/lib/adapter/DBAdapter.PHP中

有什么建议吗?

嵌套集算法在很大程度上依赖于"left"answers"right"列上的WHERE子句,以维护树的正确结构。如果随着节点的增加,查询速度越来越慢,那么解决方案可能是在这些列上添加索引。