我总是觉得差异,简单来说,PHP / MySQL缓冲和无缓冲查询之间的区别是缓冲(默认)将所有数据加载到结果集变量中,然后你可以开始使用它们,而unbuffered一次加载一行。
假设您运行SELECT * FROM sometable
然后执行$result = $db->query($query);
,$result
将包含所有行和补充信息,例如行数。因此,如果您在100MB数据库上执行此操作,那么如果没有索引,那么您期望$result
占用约100MB。
但是,我遇到了这个SO overflow question部分的缓冲查询:
[]结果将包含一些依赖于实现的行缓冲区。它可能是100行或更多或更少。每行返回所有列;当您最终获取更多行时,客户端将向服务器请求更多行。这可能是客户用完或者可能是先发制人。
这是对的,还有一些缓冲正在进行吗?如果是这种情况,在处理大型结果集时,我们通常不需要担心PHP内存不足吗?这很奇怪,因为我在40MB测试表上运行了一些测试缓冲查询,PHP总是报告大约5MB的峰值内存使用量。
最后,根据经验,你什么时候选择无缓冲的缓冲?你能举个例子吗?
感谢。
(顺便说一句,我使用的是MySQLi。我认为校长是一样的。)
编辑:我现在读了更多,更加困惑。在http://php.net/manual/en/mysqli.quickstart.statements.php它说On After语句可以立即检索执行结果,以便客户端缓冲或逐行读取。客户端结果集缓冲允许服务器尽可能早地释放与语句结果相关联的资源。一般来说,客户端是慢速消耗结果集。因此,建议使用缓冲结果集。 mysqli_query()结合了语句执行和结果集缓冲。
PHP应用程序可以通过缓冲结果自由导航。导航很快,因为结果集保存在客户端内存中。请记住,客户端扩展通常比扩展服务器更容易。
并在http://php.net/manual/en/mysqli-result.fetch-all.php上说:
由于mysqli_fetch_all()在一个步骤中将所有行作为数组返回,因此它可能比某些类似函数(如mysqli_fetch_array())消耗更多内存,而mysqli_fetch_array()仅从结果集中一次返回一行。此外,如果需要迭代结果集,则需要一个循环结构,这将进一步影响性能。出于这些原因,mysqli_fetch_all()仅应用于将获取的结果集发送到另一层进行处理的情况。
这似乎有些矛盾。 “客户端结果集缓冲”和“消费结果集”之间的区别是什么?一个人说他们被关在客户端内存中,另一个人说是逐行阅读。如果整个事情被缓冲到PHP,为什么最后的引用说如果你在一个步骤中将所有行作为数组返回它可能会消耗更多内存?
答案 0 :(得分:14)
请参阅:http://php.net/manual/en/mysqlinfo.concepts.buffering.php
无缓冲的MySQL查询执行查询然后返回资源 而数据仍然在MySQL服务器上等待获取。 这在PHP端使用较少的内存,但可以增加负载 服务器。除非从服务器获取完整的结果集否 可以通过同一连接发送进一步的查询。无缓冲 查询也可以称为“使用结果”。
遵循这些特性,在您希望只有有限的结果集或需要在读取所有行之前知道返回的行数量的情况下,应使用缓冲查询。当您期望更大的结果时,应使用无缓冲模式。
缓冲查询是默认的。
无缓冲的示例:
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
if ($uresult) {
while ($row = $uresult->fetch_assoc()) {
echo $row['Name'] . PHP_EOL;
}
}
$uresult->close();
?>
希望这会有所帮助