如何使用 Laravel/PHP 和 MySQL 有效地将数组插入为嵌套集模型

How to efficiently insert an array as nested set model with Laravel/PHP and MySQL

我正在使用这个包来处理 Laravel 中的层次结构数据:https://github.com/lazychaser/laravel-nestedset

它们是一个已实现的功能,它提供了使用多维数组 create 新数据的机会。所以我有以下示例数组(file/directory 层次结构):

array:3 [
  "name" => "Folder1"
  "type" => "folder"
  "children" => array:2 [
    0 => array:2 [
      "name" => "test1.txt"
      "type" => "txt"
    ]
    1 => array:3 [
      "name" => "Folder1.1"
      "type" => "folder"
      "children" => array:2 [
        0 => array:2 [
          "name" => "file.png"
          "type" => "png"
        ]
        1 => array:3 [
          "name" => "folder1.1.1"
          "type" => "folder"
          "children" => array:1 [
            0 => array:2 [
              "name" => "file.txt"
              "type" => "txt"
            ]
          ]
        ]
      ]
    ]
  ]
]

但是它们是包含超过 10GB 数据的目录,这意味着它们的复杂性比显示的具有深层层次结构的示例要高得多。数据库已经充满了超过一百万行。如果我尝试插入一个新数组,MySQL 会立即以 100% CPU 运行,并且需要大约 20 分钟才能将该新结构插入数据库。

原因是考虑到 table.

中已经存在的数据,需要为嵌套集计算 LEFT 和 RIGHT

是否有更有效的方法将此类层次结构插入数据库?

将左右项目添加到各种数组的快速示例(假设数组的最低级别是一行项目,因此无需为这些单独的项目添加左右项目)。

类似这样的东西可以用来添加值

<?php 

  function array_left_right (&$array, &$counter = 1)
  {
    if (is_array($array))
    {
      $array['left'] = $counter++;
      foreach($array as $array_key=>&$array_item)
      {
            array_left_right($array_item, $counter);
      }
      $array['right'] = $counter++;
    }
  }

  $fred = array(array(array('a', 'b'), array('c', 'd'), array('e', 'f'), array('g', 'h')),array(array('aa', 'ab'), array('ac', 'ad'), array('ae', 'af'), array('ag', 'ah')));

  array_left_right($fred);

  print_r($fred);