簡體   English   中英

PHP:查詢結果如何存儲在mysqli_result中

[英]PHP: how are query results stored in mysqli_result

當我查詢數據庫並在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中。 因此結果存儲在哪里。

在獲取結果和存儲指向資源的指針之間存在巨大差異。

如果您echo $r; 在您第一次調用memory_get_usage(); ,您將意識到它只是一個指針。 這是指向結果集的指針。 fetch結果之前,結果集實際上不會存儲到內存中。

我建議您針對要執行的操作運行fetchAll() 然后,這將導致一種方法以更好的性能訪問所有結果,因為它是基於mysqli擴展(C庫)而不是PHP中的循環而產生的。

完成結果后,您還可以使用免費結果功能從內存中清除結果。 如果您熟悉,這就像在Java中關閉游標。

我認為您應該改為:

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

您發布的方式是在$rows收集大量數組,而內存使用情況反映了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM