2012-07-29 62 views
8

當我對數據庫進行查詢並在mysqli_result中檢索結果時,內存使用量非常小。但是,當我將查詢結果中的所有行提取到關聯數組時,內存使用率變得非常高。PHP:如何將查詢結果存儲在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。那麼結果存儲在內存的哪裏呢?

+1

我在某處讀到'mysql_ *'函數一次從服務器獲取所有結果行。然而,PDO(並可能是mysqli)按需檢索每一行。所以每次打電話時,你都會用盡一點記憶。但是你將每一行存儲在一個數組中,所以你的內存使用情況將會積累起來。 – 2012-07-29 03:29:45

+0

你的意思是說,每次調用訪存,mysqli都會查詢數據庫中的結果嗎? – spchuang 2012-07-29 03:31:46

+1

根據我的理解,當你調用query()時,MySQL執行查詢並準備將所有結果行返回給PHP。但是,如果mysqli與PDO(至少是PDO的默認值)類似,那麼在調用fetch之前它不會開始接收行。除非您調用'fetchAll()',否則每行將檢索一行。這意味着你的內存使用情況是因爲你將結果保存在一個數組中,而不是因爲mysqli。 – 2012-07-29 03:34:31

回答

2

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

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

我建議你運行fetchAll()爲你正在做的事情。這會導致1個方法訪問所有結果,並且性能更好,因爲它在mysqli擴展(C庫)中宕機,而不是PHP中的循環。

你也可以使用免費的結果功能來清除你的結果,當你完成它們。這就像在Java中關閉遊標,如果你熟悉。

+0

謝謝。這非常有幫助! :) – spchuang 2012-07-29 20:29:09

+0

那麼,爲什麼不是實際添加到內存使用的資源?該資源正在使用內存空間......或者它被寫入磁盤或其他東西? – 2014-05-12 22:03:27

+0

在調用fetch之前,通過echo'ing'$ r',MySQL將爲查詢結果分配空間,但不會爲PHP分配空間。當你調用fetch時,PHP只會將結果分配給它的內存空間。 – 2014-05-13 00:07:01

1

我想你應該給這個:

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

您發佈的方式聚集了巨大的數組中$rows和內存使用情況反映。

+0

我知道你的意思,這絕對是fetch_assoc()的初衷。問題是,我將獲取結果並對其執行一些操作,並將其傳遞給View(以MVC的方式)來顯示記錄。我想我可以改變我的實現,以便一次傳遞一個記錄以查看。 – spchuang 2012-07-29 03:38:57

+0

這將是明智的:) – Niloct 2012-07-29 03:42:26

+0

謝謝。這是一個問題,因爲我一直試圖避免直接與模型進行交流,所以我也有一個控制器來傳遞數據。那麼我需要做的是創建一個真正的小視圖模板來顯示每條記錄...... – spchuang 2012-07-29 03:49:05

相關問題