多次查询后MySQL内存不足

时间:2016-03-10 06:22:43

标签: php mysql

我试图遍历两个表并拉取记录。这些表有几十万行,所以我知道将它们全部拉到一起是不行的,所以循环并分批拉它们似乎是最好的方法,但是它没有释放内存,所以在少数人会因内存耗尽而崩溃。

我的输出


    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删除以前查询的内存缓存的方法。

1 个答案:

答案 0 :(得分:0)

我认为您可能正在寻找无缓冲的查询:

  

无缓冲的MySQL查询执行查询,然后在数据仍在MySQL服务器上等待获取时返回资源。这在PHP端使用的内存较少,但可能会增加服务器的负载。除非从服务器获取完整结果集,否则无法通过同一连接发送进一步的查询。无缓冲的查询也可以称为&#34;使用结果&#34;。

这是一个无缓冲的查询示例:

$get = $g_mysqli->query($query, MYSQLI_USE_RESULT);

您可以阅读更多here