【问题标题】:PHP MySQL recursion slow, how to speed up?PHP MySQL递归慢,如何加快?
【发布时间】:2013-12-21 02:12:32
【问题描述】:

我有一个递归 MySQL 查询,它返回大约 25000 个结果,这需要很长时间才能加载。

我想知道是否有办法对结果进行分页或加快速度。

代码如下:

function getChildIds($id) {    
    echo ' <tr><td> Client No.: </td><td> ';echo $id;echo ' </td></tr> ';

    $sql_query="select id from rev_r_clients WHERE parent_client_id='$id'";
    $res = mysql_query($sql_query);
    $ids = Array();
    while($row = mysql_fetch_object($res)){
        if ($row->id) {
            $ids[] = $row->id;
        }
    }

    array_walk($ids, 'getChildIds');
}

【问题讨论】:

标签: php mysql recursion pagination


【解决方案1】:

正如其他人所提到的,主要问题是您为每个用户运行一个 MySQL。这样做的开销可能很大,因此您最好减少查询量。

一种方法是在一次查询中查询所有数据,然后递归处理。但是,从外观上看,您只想获取所有用户的所有孩子。 您可以通过一个 MySQL 查询以非常简单的方式做到这一点

 SELECT
      p.id AS parent,
      GROUP_CONCAT(c.id) AS children
 FROM
     rev_r_clients AS p
     JOIN rev_r_clients AS c ON c.parent_client_id = p.id
 GROUP BY
     p.id

这将在一个查询中为您提供每个用户及其孩子。之后您可以使用explode 将它们放入一个数组中(因为GROUP_CONCAT 将为您提供一个逗号分隔的列表)。


根据您的 cmets,您只想创建一个用户树。根据信息,这是您可以使用的代码:

# NOTE: I am using mysqli, that is what you should do as well
$res = $mysqli_conn->query(<THE_QUERY_ABOVE>);
$parents = Array();

while($row = $res->fetch_assoc()) {
    $parents[$row['parent']] = explode($row['children'])
}

该代码运行后,$parent 数组是 ID 到其子 ID 数组的映射,您可以将其用于您需要/想要的任何内容。如果 ID 不在数组中,则表示它没有子代。

【讨论】:

  • 在以下情况下无法“完成代码”:a) 您没有指定要执行或获取的内容,并且 b) 此查询显然会使您的代码过时。
  • 我正在尝试获取给定 ID(树)的所有子项和子项等。
  • 这已经很清楚了,你想用它们做什么?您的代码没有任何 return
  • @user3117183 在这里查看如何构建分层树:stackoverflow.com/questions/192220/…
  • 如果您只是在回显 ID,那么我不确定您为什么要费尽心思使用递归函数。如果您真正想要的是创建一个用户树,您可以在 $parents 数组上使用您的递归函数,我的回答会留给您
【解决方案2】:

理想情况下,您将获取一次数据库结果并在结果上使用递归函数 - 传递结果或其中的一部分 - 而不是在递归函数本身中进行数据库调用。

这会占用更多内存,但肯定会加快速度。

【讨论】:

  • 你可以发布示例吗?
【解决方案3】:

此外,它还需要通过下一个/上一个按钮传递 $limit 和 $offset 数字。

关注:你在处理mysql注入吗?

$sql_query="select id from rev_r_clients WHERE parent_client_id='$id' limit $limit offset $offset";

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多