对比PHP对MySQL的缓冲查询和无缓冲查询
关于PHP中的MySQL缓冲查询与无缓冲查询对比
在PHP与MySQL的交互中,数据的查询方式主要有两种:缓冲查询和无缓冲查询。这两种查询方式各有其特色和适用场景。
一、缓冲查询
缓冲查询是MySQL客户端的默认查询模式。在这种模式下,查询结果会被存储在客户端的缓存中。这意味着,一旦查询执行完毕,结果集就会完整地呈现在客户端,供开发者自由操作。你可以自由地移动“当前行”的指针,快速找到所需数据,因为结果集已经存在于客户端。
缓冲查询需要额外的内存来存储结果集。当结果集非常大时,这可能会消耗大量的内存资源。在PHP中运行查询的函数需要等到所有结果都接收完毕才会返回值,这在处理大数据集时可能会产生延迟。
二、无缓冲查询
与缓冲查询不同,无缓冲查询不会将结果集存储在客户端。它限制了你通过严格的顺序访问查询结果,但不需要额外的内存来存储整个结果集。这种查询方式在结果集巨大的情况下非常有用,因为它可以节省大量的临时内存。
使用无缓冲查询时,你必须在MySQL服务器开始返回值的时候就开始获取并处理或显示数据行。这意味着,一旦开始获取数据,你就无法向服务器发送其他命令,直到所有的数据行都被读取或者结果集被用mysqli_free_result释放。
哪种查询方式更好?这主要取决于具体情况。如果你正在处理的结果集非常大,那么无缓冲查询可能会是更好的选择,因为它可以节省内存资源。如果你需要频繁地访问和修改结果集,那么缓冲查询可能会更合适,因为它提供了更大的灵活性。
缓冲查询和无缓冲查询都有其优点和缺点。在选择使用哪种方式时,你需要根据具体的应用场景和需求进行权衡。对于大多数情况,缓冲查询可能更适合大多数应用场景,因为它提供了更灵活的数据操作方式。在特定的情况下,无缓冲查询可能会是更好的选择,特别是在处理大量数据或内存资源有限的情况下。PHP与MySQL的缓冲查询和无缓冲查询
在PHP中使用MySQL数据库时,我们主要通过mysqli或pdo_mysql进行查询操作。默认情况下,PHP MySQL查询使用缓冲模式。这意味着查询结果会一次性从MySQL传输到PHP进程内存中。在这种模式下,我们可以统计结果集的行数并移动结果集指针。如果结果集非常大,PHP进程会占用大量内存,直到结果集被清除。
缓冲模式下,当使用store_result时,所有结果会一次性存储到PHP进程中。例如,通过mysqli::query MYSQLI_STORE_RESULT、mysqli::store_result或mysqli_stmt::store_result可以实现这一操作。值得注意的是,如果PHP的MySQL数据库驱动底层使用的是libmysqlclient,那么memory_limit可能无法统计到结果集占用的内存,除非结果集已经赋值给PHP变量。而从PHP 5.4开始,底层默认使用的是mysqlnd驱动,它可以统计这部分内存。
相对于缓冲模式,无缓冲模式下执行的查询将返回一个资源引用,结果集位于MySQL中等待PHP获取。在这种模式下,PHP进程占用的内存较少,但可能会增大MySQL服务器的负载。在PHP取回所有结果之前,无法发送其他的查询请求。我们可以通过使用mysqli::query MYSQLI_USE_RESULT或mysqli::use_result来执行无缓冲查询。
当处理的结果集不大,或者需要在读取所有行前获取结果集行数时,我们通常使用缓冲查询(默认设置)。而当结果集非常大时,我们更倾向于使用无缓冲查询,以避免PHP进程占用大量内存。
在实际操作中,例如通过$rs = $mysqli->query("SELECT FROM City", MYSQLI_USE_RESULT)进行无缓冲查询,或者通过$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false)设置PDO的无缓冲查询。对于mysqli_stmt的SELECT查询结果,默认情况下会留在MySQL服务器上等待fetch方法逐条取回到PHP程序中。如果需要对所有记录进行处理,我们可以调用mysqli_stmt::store_result将所有结果一次性传回到PHP程序中,这样做能减轻MySQL服务器的负担。获取SELECT语句查找到的记录数,可以使用mysqli_stmt::$num_rows属性。但需要注意的是,这个属性只有在执行过mysqli_stmt::store_result方法后才可使用。相比之下,mysqli_result::$num_rows则没有这一限制。还需要注意使用mysqli_stmt::free_result关闭结果集以释放资源。
整理一下相关参数:
mysqli::query:执行SQL并返回结果集对象或布尔值。成功时返回mysqli_result(对于SELECT、SHOW、DESCRIBE操作)对象或TRUE(其他操作),失败时返回FALSE。使用mysqli::close关闭连接。
mysqli::prepare:预处理SQL并返回statement对象或布尔值。成功时返回statement对象,失败时返回FALSE。
mysqli_stmt::execute:执行SQL语句。使用mysqli_stmt::close关闭statement对象。
mysqli_stmt::store_result:可选操作,用于取回全部查询结果(SELECT、SHOW、DESCRIBE、EXPLAIN)。使用mysqli_stmt::free_result关闭结果集以释放资源。
mysqli_stmt::bind_result:将prepare和execute产生的结构绑定到变量上,然后在mysqli_stmt::fetch中将这些变量输出或赋值。
mysqli_stmt::fetch:每次返回结果集的一条记录并赋值给绑定的变量。
mysqli_stmt::get_result:获取结果对象,然后调用mysqli_result::fetch_all以返回结果集数组(仅在mysqlnd驱动下可用)。其他方法如mysqli_result::fetch_assoc和mysqli_result::fetch_row也用于从结果集中获取数据。这些方法都需要在获取数据后调用mysqli_result::close关闭结果集以释放资源。
网络推广网站
- 对比PHP对MySQL的缓冲查询和无缓冲查询
- dhtmlxTree目录树增加右键菜单以及拖拽排序的实现
- JavaScript中正则表达式判断匹配规则及常用方法
- jQuery实现鼠标经过时高亮,同时其他同级元素变暗
- thinkPHP微信分享接口JSSDK用法实例
- 基于Java的代理设计模式
- php中get_meta_tags()、CURL与user-agent用法分析
- 自制微信公众号一键排版工具
- Javascript Function.prototype.bind详细分析
- SQL Server使用row_number分页的实现方法
- JS库之Waypoints的用法详解
- PHP读取Excel类文件
- 几个常用的ASP函数
- 详解NodeJs支付宝移动支付签名及验签
- WebGL学习教程之Three.js学习笔记(第一篇)
- WordPress中的shortcode短代码功能使用详解