当前位置: 首页 > 面试题库 >

PHP + MySQL:缓冲查询和非缓冲查询之间的区别

穆才良
2023-03-14
问题内容

简单的说,我总是对PHP / MySQL缓冲查询和非缓冲查询之间的区别是,缓冲(默认)将所有数据加载到结果集变量中, 然后
您可以开始使用它们,而无缓冲则在以下位置加载行:一个时间。

假设您先运行SELECT * FROM sometable然后进行了$result = $db->query($query);$result它将包含所有行和补充信息,例如行数。因此,如果您在100MB的html" target="_blank">数据库上执行此操作,那么$result如果那里没有索引,则可能会占用约100MB的空间)。

但是,我遇到了这样的SO溢出问题,其中一部分涉及缓冲查询:

结果将包含一些与实现相关的行缓冲区。它可能是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_all()仅应在将获取的结果集发送到另一层进行处理的情况下使用。

这似乎有些矛盾。“客户端结果集缓冲”和“使用结果集”之间有什么区别?一个说他们被保存在客户端内存中,另一个说一行一行地读取。如果整个内容都缓存在PHP中,为什么最后一个引号说如果在一步中将所有行作为数组返回,可能会消耗更多的内存?


问题答案:

参见: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();
?>

希望这可以帮助



 类似资料:
  • 缓冲区查询 缓冲区查询,即在数据服务中的指定数据集集合中查找符合缓冲区的矢量要素,并在客户端中展示出来。 以 World 数据服务为例。使用接口 ol.supermap.FeatureService 在数据集 “World:Capitals” 中查找符合此缓冲区范围距离为10度(地图坐标单位)的矢量要素。 //指定矩形范围查询处理 var polygon = new ol.geom.Polygon

  • 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 查询缓存存储SELECT查询的文本以及发送给客户端的相应结果。如果随后收到一个相同的查询,服务器从查询缓存中重新得到查询结果,而不再需要解析和执行查询。 如果你有一个不经常改变的表并且服务器收到该表的大量相同查询,查询缓存在这样的应用环境中十

  • 问题内容: 我在使用PHP数据对象功能时遇到了一些严重问题。我试图使用缓冲查询循环遍历一个较大的结果集(〜60k行,〜1gig),以避免获取整个结果集。 不管我做什么,脚本都只是挂在PDO :: query()上-看来查询正在无缓冲运行(为什么结果集大小的更改会“解决”问题?)。这是我的代码来重现该问题: 如果我将查询限制在一个合理的数字范围内,则可以正常运行: 我尝试过使用PDO :: MYSQ

  • 本文向大家介绍php如何执行非缓冲查询API,包括了php如何执行非缓冲查询API的使用技巧和注意事项,需要的朋友参考一下 对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。 非缓冲查询方法一: mysqli 非缓冲查询方法二: pdo_mysql 非缓冲查询方法三: mysql 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 10.3. 缓冲节点查询 kgp.py 使用了多种技巧,对你进行 XML 处理而言它们或许有用。第一个就是,使用输入文档的结构稳定特征来构建节点缓冲。 一个语法文件定义了一系列的 ref 元素。每个 ref 包含了一个或者多个 p 元素,p 元素可以包含很多不同的东西,包括 xref。无论何时你遇到一个 xref ,都可以通过相同的 id 属性找到相对应的 ref 元素,并选择 ref 元素的子元

  • 本文向大家介绍假脱机和缓冲之间的区别,包括了假脱机和缓冲之间的区别的使用技巧和注意事项,需要的朋友参考一下 在计算机性能方面,主要因素是多任务处理,即CPU如何在不同的输入输出子系统之间划分和执行进程。为了最有效地处理任务,计算机系统使用各种方法来计划任务,加快计算速度并改善Web浏览,其中假脱机和缓冲是主要方法。 以下是假脱机和缓冲之间的重要区别。 序号 键 假脱机 正在缓冲 1 定义 后台打印