![](/img/trans.png)
[英]PHP mysqli query is not returning mysqli_result object on SELECT statement
[英]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.