【发布时间】:2012-07-27 05:29:47
【问题描述】:
当我对数据库进行查询并在 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 查询结果。那么结果在内存中存储在哪里。
【问题讨论】:
-
我在某处读到
mysql_*函数一次从服务器获取所有结果行。但是 PDO(可能还有 mysqli)按需检索每一行。因此,每次调用 fetch 时,都会消耗一点内存。但是您将每一行存储在一个数组中,因此您的内存使用量会累积是有道理的。 -
你的意思是每次调用fetch,mysqli都会查询数据库的结果吗?
-
据我了解,当您调用
query()时,MySQL 会执行查询并准备将所有结果行返回给 PHP。但是,如果 mysqli 类似于 PDO(至少是 PDO 的默认值),那么在您调用 fetch 之前它不会开始接收行。除非您调用fetchAll(),否则将一次检索每一行。这意味着您的内存使用是因为您将结果保存在数组中,而不是因为 mysqli。 -
您可能想查看
free()。我认为您的阵列存储会影响结果。在调用free()后也尝试测量内存使用情况。然后可以观察mysqli实际使用了多少内存。