8

当我对数据库进行查询并在 mysqli_result 中检索结果时,内存使用量非常小。但是,当我将查询结果中的所有行提取到关联数组中时,内存使用率会变得非常高。

<?php
    require_once("../config.php"); //db connection config
    $db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE);

    $query ="select * from table_name";
    if($r = $db->query($query)){
    echo "MEMORY USAGE before :  ". memory_get_usage()."<br><br>";
    $rows = array();
    while($row = $r->fetch_assoc()){

        $rows[]= $row;
    }
    echo "MEMORY USAGE after :  ". memory_get_usage()."<br><br>";


    //before: 660880
    //after:  114655768
    // # of records: around 30 thousands
?>

对我来说存储这么多结果非常消耗内存是有道理的,但我只是想知道 mysqli_result 怎么会这么小。不可能每次调用 fetch_assoc 时都向 dbase 查询结果。那么结果存储在内存中的位置。

4

2 回答 2

2

获取结果和存储指向资源的指针之间存在巨大差异。

如果你echo $r;在第一次调用之前memory_get_usage();,你会意识到它只是一个指针。这是指向您的结果集的指针。在fetch您获得结果之前,结果集实际上不会存储到内存中。

我建议你fetchAll()为你想做的事情而奔跑。这将导致 1 种方法以更好的性能访问所有结果,因为它是在 mysqli 扩展(C 库)而不是 PHP 中的循环上产生的。

您还可以使用免费结果功能在完成后从内存中清除结果。如果您熟悉的话,这就像在 Java 中关闭游标一样。

于 2012-07-29T04:30:30.633 回答
1

我认为你应该这样做:

while($row = $r->fetch_assoc()){
   //Do whatever you need with the record, then:
   unset($row);
}

您发布的方式是在 中收集一个巨大的数组$rows,内存使用情况反映了这一点。

于 2012-07-29T03:34:25.193 回答