我有一个返回大约 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/