mysqli_store_result()与mysqli_use_result()

时间:2012-03-26 17:22:56

标签: php mysqli

问题

mysqli::store_result()mysqli::use_result()之间的区别是什么?

故事

模糊文件

PHP.net上的文档似乎对两者之间的差异非常模糊。 mysqli::use_result() - 页面不提供任何代码示例,并将您链接到mysqli::multi_query()页面以查找它们。在该页面中,给出了以下代码示例(请参阅完整代码的页面):

/* store first result set */
if ($result = $mysqli->store_result()) {
    while ($row = $result->fetch_row()) {
        printf("%s\n", $row[0]);
    }
    $result->free();
}
/* print divider */
if ($mysqli->more_results()) {
    printf("-----------------\n");
}

mysqli::store_result() - 页面使用完全相同的代码示例,但有一个例外:

/* store first result set */
if ($result = $mysqli->use_result()) {

是的...... store_result成了use_result。请注意,即使上面的评论仍然是“存储”。

更令人困惑

看过代码示例,我想; “好吧,所以这是别名”。可是等等!该文档提供了以下描述:

它们看起来像两个不同的东西,根本不像别名。仔细看看,我发现mysqli::use_result()页面的代码示例中还有另一个例外:$result->free();变为$result->close();。然而,当我发现在第二个代码示例中的同一页面(程序等效)时,我发现真相的希望很快就被破坏了,mysqli_free_result($result);被使用了,而不是预期的mysqli_close_result($result);

3 个答案:

答案 0 :(得分:37)

mysqli::store_result()将从MySQL服务器获取整个结果集,而mysqli::use_result()将逐个获取行。

您在链接到的mysqli::use_result文档中也提到了这一点:

  

mysqli_use_result()函数不会从数据库传输整个结果集,因此无法使用mysqli_data_seek()等函数移动到集合中的特定行。要使用此功能,必须使用mysqli_store_result()存储结果集。如果在客户端执行大量处理,则不应使用mysqli_use_result(),因为这会占用服务器并阻止其他线程更新从中获取数据的任何表。

除非您有充分理由不立即从服务器读取所有行,否则通常可以始终使用mysqli::store_result()

答案 1 :(得分:15)

use_result会返回无缓冲结果。

store_result会返回缓冲结果。

答案 2 :(得分:0)

我认为这种详细说明可能会帮助人们从支持通过数组或枚举器检索的语言来到这里。因为这只是差异。

对于.NET,它与GetDirectories(store_results)vs EnumerateDirectories(use_results)(以及File / DbResult / CSV解析/ XML解析等价物)的区别相同。

枚举器变体使用较少(PHP)的客户端内存,并且可能在当前行处理时在后台异步获取下一行,从而使客户端的内存和处理时间更长。以占用(SQL)服务器资源更长的代价为代价(因为结果集尚未完全传输)。

反过来,get / array方式将在一次阻塞操作中检索数据,占用更多客户端内存以便更早地释放数据库内存。

就个人而言,我会默认使用非枚举器方式,除非你确实遇到(客户端)内存问题。

在.NET中,如果遇到x32进程的2/3 GiB限制,则必须使用Enumerator方式。文件的特定EnumerateLines在这里很重要。 使用DB结果时,不应该开始。 2 GiB DB结果是方式过滤不足(在Query中进行更多过滤)或包含大量Blob(如果可能,您应该逐个加载或甚至让浏览器通过http处理程序检索)