首页 > 解决方案 > PHP处理MySQL逐行查询

问题描述

我结合了一个 PHP 脚本来计算 MySQL 文本字段中的单词并相应地更新另一个字段。

它适用于相对较小的表 - 但是当我尝试使用非常大的表(10M 记录)时 - 当然我有“PHP致命错误:允许的内存大小为 134217728 字节已用尽”

有人可以提示如何修改下面的脚本以“逐行”处理数据吗?

<?php
$con1 = mysqli_connect('localhost','USERNAME','PASSWORD','DATABASE');
if (!$con1) {
    die('Could not connect: ' . mysqli_error($con1));
}
$sql = "SELECT id FROM TableName";
$result = mysqli_query($con1, $sql);
while ($row = mysqli_fetch_assoc($result)) {
    $to = $row["id"];
    $sql1 = "SELECT textfield FROM TableName WHERE id = '$to' ";
    $result1 = mysqli_query($con1,$sql1);
    $row1 = mysqli_fetch_assoc($result1);
    $words=(str_word_count($row1['textfield'],0));
    $sql2="UPDATE TableName SET wordcount = '$words' WHERE id ='$to'";
    $result2 = mysqli_query($con1,$sql2);
}
mysqli_close($con1);
?>

标签: phpmysql

解决方案


MySQL 查询有子句limit o, n,所以你可以运行

SELECT id FROM TableName limit 0, 10

例如从一开始就只获取 10 个元素。现在,第一个数字是偏移量(您开始工作的索引),第二个是您希望获得的元素数量。现在,这些是你需要知道的想法才能成功地做到这一点:

  • 你需要写一个循环
  • 在循环中,您将始终获得 n 个元素(n 可以是您想要的 1,或者更多)
  • 在每一步中,您将 o 增加 n,因此新的偏移量将从结果先前结束的位置开始
  • 您可以确保订单,order by id例如
  • 您可以将我们在这里谈论的循环包裹在您的大部分代码中

推荐阅读