从循环中进行大型选择时出现超时错误

我下面有一个简单的 php 代码


$sql_items = "SELECT id FROM item_masterfile"; /* this query has 7000 rows */


$result_items = mysqli_query($con,$sql_items);

    while ($row_items  = mysqli_fetch_row($result_items)) {

        $sql_qty = "SELECT qty FROM inventory WHERE id = ".$row_items[0];

        /* rest of the code here */

    }

}

这是可行的,但由于大量数据,我的服务器无法处理它,并且其他查询需要很长时间才能响应。我怎样才能解决这个问题?我这里的目标是批量选择?防止堵塞?


我在这个过程中看到的是很多选择等待启动。


我怎样才能解决这个问题?


湖上湖
浏览 108回答 4
4回答

慕虎7371278

尝试执行以下步骤:获取第一个查询的结果并获取 id 值,例如 (1,2,3,4,...)..并在 where 子句之外执行带有WHERE条件IN子句的第二个查询喜欢$sql_items = "SELECT id FROM item_masterfile"; /* this query has 7000 rows */$result_items = mysqli_query($con,$sql_items);    while ($row_items  = mysqli_fetch_row($result_items)) {        $ids[] = $row_items['id'];    }    $sql_qty = "SELECT qty FROM inventory WHERE id IN  ".$ids;      /* rest of the code here */}

收到一只叮咚

尝试使用限制和偏移量进行批量处理,如下所示$offset = $i * 5000; // $i is run batch number .. 1, 2, 3 etc in the foreach() loop.if ($i == 0) {  $offset = "";}$result_items="SELECT id FROM item_masterfile LIMIT 5000 OFFSET $offset;";

一只甜甜圈

您问题中的代码显示表之间存在 one_to_one 或 one_to_many 关系,因此使用分页和 join 语句可以解决该问题。检查下面的代码希望有帮助$sql = "     SELECT im.id, i.qty      FROM item_masterfile AS im      JOIN inventory AS i ON      im.id = i.item_masterfile_id      LIMIT $offset, $limit";$result_items = mysqli_query($con,$sql);您可以在代码中动态设置 $offset 和 $limit 并继续...

斯蒂芬大帝

您应该收集数组中的所有 id,然后使用 IN 运算符将所有 id 一次性传递给查询,而不是使用循环并在其中提供 id。示例:SELECT qty FROM inventory WHERE id IN (1,2,3,4,5). 通过这样做,您可以避免循环,并且您的代码不会因超时错误而退出。或者您可以在主查询中使用子查询来实现相同的效果例子:SELECT qty FROM inventory WHERE id IN (SELECT id FROM item_masterfile)
打开App,查看更多内容
随时随地看视频慕课网APP