当我对数据库进行查询并在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查询结果。那么结果存储在内存中的哪个位置。
答案 0 :(得分:2)
获取结果和存储指向资源的指针之间存在巨大差异。
如果您在第一次致电echo $r;
之前memory_get_usage();
,您会发现它只是一个指针。这是指向结果集的指针。在您fetch
结果之前,结果集实际上不会存储到内存中。
我建议您运行fetchAll()
以查找您要执行的操作。这将导致1方法以更好的性能访问所有结果,因为它是在mysqli扩展(C库)而不是PHP中的循环中进行的。
完成后,您还可以使用免费结果功能从内存中清除结果。这就像在熟悉的情况下用Java关闭游标一样。
答案 1 :(得分:1)
我认为你应该这样做:
while($row = $r->fetch_assoc()){
//Do whatever you need with the record, then:
unset($row);
}
您发布的方式是在$rows
中收集一个巨大的数组,内存使用情况反映了这一点。