2012-07-29 85 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

相关问题