我试图遍历两个表并拉取记录。这些表有几十万行,所以我知道将它们全部拉到一起是不行的,所以循环并分批拉它们似乎是最好的方法,但是它没有释放内存,所以在少数人会因内存耗尽而崩溃。
我的输出
400000 Pulled, currently on 0 || Out of 1623230 400000 Pulled, currently on 400000 || Out of 1623230 Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 39 bytes) in C:\xampp\htdocs\misc\manage tickets\test2.php on line 38
忽略行号,我在文件顶部有一个巨大的注释掉代码块。
代码是:
$iterate = 400000;
$query = "SELECT id FROM $old_db.ticketaudit_archive";
$get = $g_mysqli->query($query);
$count = $get->num_rows;
$i = 0;
while($i <= $count){
$query = "SELECT * FROM $old_db.ticketaudit_archive LIMIT $i, $iterate";
$get = $g_mysqli->query($query);
echo $get->num_rows.' Pulled, currently on '.$i.' || Out of '.$count.'<br>';
while($z = $get->fetch_assoc()){
$old_ticket_id = $z[old_ticket_id];
$ticket_id = $z[ticket_id];
unset($z[old_ticket_id], $z[ticket_id], $z[id]);
if($old_ticket_id != ''){
$ticketaudit[old_ticket_id][$old_ticket_id][] = $z;
$xx += 1;
}
elseif($ticket_id != ''){
$ticketaudit[ticket_id][$ticket_id][] = $z;
$xx += 1;
}
}
$i += $iterate;
$get->free();
$get->free_result();
$get->close();
}
我整天都在这里,并且无法找到让MySQL删除以前查询的内存缓存的方法。
答案 0 :(得分:0)
我认为您可能正在寻找无缓冲的查询:
无缓冲的MySQL查询执行查询,然后在数据仍在MySQL服务器上等待获取时返回资源。这在PHP端使用的内存较少,但可能会增加服务器的负载。除非从服务器获取完整结果集,否则无法通过同一连接发送进一步的查询。无缓冲的查询也可以称为&#34;使用结果&#34;。
这是一个无缓冲的查询示例:
$get = $g_mysqli->query($query, MYSQLI_USE_RESULT);
您可以阅读更多here