PHP MySQL递归慢,如何加速?

标签 php mysql recursion pagination

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

我想知道是否有办法对结果进行分页或使事情变得更快。

代码如下:

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');
}

最佳答案

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

一种方法是在单个查询中查询所有数据,然后按照您的操作递归处理。但是,从表面上看,您只想获得所有用户的所有 child 。 您可以通过单个 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

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


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

# 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 不在数组中,则表示它没有 child 。

关于PHP MySQL递归慢,如何加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714697/

相关文章:

java - 行列迷宫递归错误

java - 使用递归的整数除法——以及其他一些有趣的限制

c - 如何在 BST 中添加节点?

php - PHP 中类型提示的性能开销是多少?

php - javascript限制文本区域的显示链接

php - 标题不会重定向我,不明白为什么

javascript - 如何通过ajax发送或获取日期值

php - 同时在DB中保存3张图像

php - Bcrypt 哈希检查不起作用

mysql - 同步期间外键为空(错误)