如何使用 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);
我正在使用这个包来处理 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);