Php 二叉树在大树上的高度性能

Php 二叉树在大树上的高度性能,php,mysql,tree,binary-tree,Php,Mysql,Tree,Binary Tree,我正在mysql数据库的一个表上存储一个二叉树。 该表包含id、parent和其他不重要的列。 这些列是不言自明的 我设法得到了树的高度: $depth = 0; /* @var $db PDO */ $stmt = $db->prepare( "SELECT id FROM wp_members WHERE parent = :parent AND matrix_id = :matrix_id" ); $q = new SplQueue(); $

我正在mysql数据库的一个表上存储一个二叉树。 该表包含id、parent和其他不重要的列。 这些列是不言自明的

我设法得到了树的高度:

    $depth = 0;
    /* @var $db PDO */
    $stmt = $db->prepare( "SELECT id FROM wp_members WHERE parent = :parent AND matrix_id = :matrix_id" );

    $q = new SplQueue();
    $q->push( array( 0, 0 ) );

    while (!$q->isEmpty()) {
        $cur = $q->pop();

        $stmt->bindParam( ':parent', $cur[0] );
        $stmt->bindParam( ':matrix_id', $matrix_id );

        $stmt->execute();

        $ids = $stmt->fetchAll();

        if ($cur[1] > $depth) $depth++;

        if (count($ids) > 0) $q->add( 0, array( $ids[0]['id'], $cur[1] + 1));
        if (count($ids) > 1) $q->add( 0, array( $ids[1]['id'], $cur[1] + 1));
    }

    return $depth;
PS:matrix_id=>让我们调用树id

它返回的树的高度是正确的,但问题是数据库的节点数超过了18k,仅获取树的高度就需要花费大量时间


我想知道的是我能做些什么来解决这个问题?获取树的高度需要60秒以上。

我使用了@m0rtis提出的解决方案:

ALTER TABLE `wp_members` ADD `depth` INT UNSIGNED NOT NULL AFTER `parent`;
我写了一个脚本来遍历存储关卡的树

然后我简单地说:

$sql = $wpdb->prepare( "SELECT MAX(depth) FROM wp_members WHERE matrix_id = '%d'", $matrix_id );
$height = $wpdb->get_var( $sql );

return $height === NULL ? 0 : $height;
得到了树的高度;)


PS:我选择@M0RTIS解决方案是因为它看起来很简单,在其他功能中,我需要按指定的级别获取所有节点。

我使用了@M0RTIS提出的解决方案:

ALTER TABLE `wp_members` ADD `depth` INT UNSIGNED NOT NULL AFTER `parent`;
我写了一个脚本来遍历存储关卡的树

然后我简单地说:

$sql = $wpdb->prepare( "SELECT MAX(depth) FROM wp_members WHERE matrix_id = '%d'", $matrix_id );
$height = $wpdb->get_var( $sql );

return $height === NULL ? 0 : $height;
得到了树的高度;)


PS:我选择@M0RTIS解决方案是因为它看起来很简单,在其他函数中,我需要按指定的级别获取所有节点。

我认为为此,您应该在表中为所有行存储
深度。之后,只需为所需的树选择MAX(
depth
)。甚至可以单独制作表格(
tree\u id
depth
)@m0rtis+I喜欢你的想法;)其中,
depth
是父项。
depth
+1。您可以在应用程序中应用此逻辑,也可以在Insert上使用触发器。您可以使用sql查询查找深度,请参阅我相信为此,您应该在表中为所有行存储
深度。之后,只需为所需的树选择MAX(
depth
)。甚至可以单独制作表格(
tree\u id
depth
)@m0rtis+I喜欢你的想法;)其中,
depth
是父项。
depth
+1。您可以在应用程序中应用此逻辑,也可以在Insert上使用触发器。您可以使用sql查询查找深度,请参阅