使用 MySQLi - 更适合关闭查询

Posted

技术标签:

【中文标题】使用 MySQLi - 更适合关闭查询【英文标题】:Using MySQLi - which is better for closing queries 【发布时间】:2010-09-06 19:00:34 【问题描述】:

我习惯于将变量使用量保持在最低限度。所以我想知道以下是否有任何优势:

$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30');

// Example 1
$query = $query->fetch_assoc();

// Example 2
$query_r = $query->fetch_assoc();
$query->free();

现在,如果我是对的,示例 1 应该更有效,因为 $queryunset,当我重新分配它应该释放与之相关的任何内存时。但是有一种方法 (MySQLi_Result::free()) 可以释放相关的内存 - 这是同一件事吗?

如果我不调用::free() 来释放与结果相关的任何内存,而是通过重新分配变量来释放unset,我是否也在做同样的事情?我不知道如何记录这类事情 - 有人有什么想法吗?

【问题讨论】:

【参考方案1】:

manual 似乎表明您仍应使用free() 来释放内存。我相信原因是free() 正在释放 MySQL 中的内存,而不是 php 中的内存。由于 PHP 无法为 MySQL 进行垃圾收集,因此您需要调用 free()

【讨论】:

【参考方案2】:

示例 1 分离 $query 变量与 MySQL 结果。 MySQL结果仍然存在于内存中,并且会继续存在并浪费内存,直到垃圾回收发生。

示例 2 立即释放 MySQL 结果,释放使用的资源。

但是,由于 PHP 页面的寿命通常很短,结果集很小,因此节省的内存是微不足道的。除非您在长时间运行的页面上将大量结果长期留在内存中,否则您不会注意到速度变慢。

布赖恩, PHP 可以 垃圾收集 MySQL 结果,它只是不会立即发生。 结果存在于 PHP 的内存池中,而不是 MySQL 服务器的。

(使用无缓冲查询时的内存位置略有不同,但它们在 PHP 中很少使用,不值得一提)

【讨论】:

以上是关于使用 MySQLi - 更适合关闭查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQLi 查询结果:我啥时候关闭、空闲或两者都关闭?

如何在 PHP 函数中正确使用 MySQL 查询? [关闭]

mysqli 使用 select * 和准备好的语句和查询

你能用 PDO 查询帮助我理解这个 PHP 代码吗? [关闭]

从 mysql 更新到 mysqli 后数据库查询中断

哪个更适合专业使用(web.xml(部署描述符)或@WebServlet注释?[关闭]