mysql查询大量数据占内存,PHP查询MySQL大量数据的时候内存占用分析

《PHP查询MySQL大量数据的时候内存占用分析》由会员分享,可在线阅读,更多相关《PHP查询MySQL大量数据的时候内存占用分析(4页珍藏版)》请在人人文库网上搜索。

1、PHP查询MySQL大量数据的时候内存占用分析文章主要是从原理,手册和源码分析在PH冲查询MySQ返回大 量结果时,内存占用的问题,同时对使用MySQLCAP也有涉及.跟随去 看看吧!昨天,有同事在PHF讨论群里提到,他做的一个项目由于 MySQL 查询返回的结果太多(达10万条),从而导致PHP内存不够用.所以, 他问,在执行下面的代码遍历返回的 MySQL吉果之前,数据是否已经 在内存中了 ?-复制代码代码如下 :while($row=mysql_fetch_assoc($result)/.当然, 这种问题有许多优化的方法 . 不过, 就这个问题来讲 , 我首 先想到,MySQL是经典的C。

2、/S(Client/Server,客户端/服务器)模型,在遍历结果集之前 ,底层的实现可能已经把所有的数据通过网络 (假 设使用TCP/IP)读到了 Client的缓冲区,也有另一种可能,就是数据 还在 Server 端的发送缓冲区里 , 并没有传给 Client.在查看PHF和MySQ的源码之前,我注意到PHP手册里有两个功 能相近的函数 :复制代码代码如下 :mysql_query()mysql_unbuffered_query()两个函数的字面意思和说明证实了我的想法 , 前一个函数执行 时 , 会把所有的结果集从 Server 端读到 Client 端的缓冲区中 , 而后一 个则没有 。

3、,这就是” unbuffered( 未缓冲) ”的意思 .那就是说 , 如果用 mysql_unbuffered_query() 执行了一条返回大量结果集的SQL语句,在遍历结果之前,PHP的内存是没有被结果集 占用的 . 而用 mysql_query() 来执行同样的语句的话 , 函数返回时 ,PHP 的内存占用便会急剧增加 , 立即耗光内存 .如果阅读PHP的相关代码,可以看到这两个函数的实现上的异同:复制代码代码如下 :/*protoresourcemysql_query(stringquery,intlink_identifier)SendsanSQLquerytoMySQL*/PHP。

4、_FUNCTION(mysql_query)php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU,MYSQL_S TORE_RESULT);/*/*protoresourcemysql_unbuffered_query(stringquery,intli nk_identifier)SendsanSQLquerytoMySQL,withoutfetchingandbufferingtheresult rows*/PHP_FUNCTION(mysql_unbuffered_query)php_mysql_do_query(INTERNAL_FUN。

5、CTION_PARAM_PASSTHRU,MYSQL_USE_RESULT);/*/两个函数都调用了 php_mysql_do_query(), 只差了第 2 个参数的不同,MY SQL_STORE_RES 和LM YSQL_USE_RESU再看 php_mysql_do_query()的实现:复制代码代码如下:if(use_store=MYSQL_USE_RESULT) mysql_result=mysql_use_result(&mysql-conn);elsemysql_result=mysql_store_result(&mysql-conn);mysql_use_result() 和 mysql_store_result() 是 MySQ的 CAPI函数,这两个CAPI函数的区别就是后者把结果集从 MySQLServe端全部读取到了 Client 端, 前者只是读取了结果集的元信息 .回到PHP使用mysql_unbuffered_query(), 可以避免内存的立 即占用.如果在遍历的过程不对结果进行” PHP缓存”(如放到某数组 中), 则整个执行过程虽然操作了十万条或者百万条或者更多的数据 , 但PHP占用的内存始终是非常小的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL查询大量数据时,有几个方面需要考虑。首先,内存占用是一个重要的问题。可以通过查询MySQL返回大量结果的原理、手册和源码分析来了解如何优化内存占用问题。其次,可以通过开启慢查询日志来找出较慢的SQL语句。另外,还有一些查询的优化技巧,比如尽可能将操作移至等号右边、简化SQL语句、拆分大语句、减少锁时间、避免使用函数和触发器、少用JOIN、使用同类型进行比较、避免使用!=或<>操作符、使用BETWEEN而不是IN、使用LIMIT来分页等。对于使用Mybatis的情况,可以通过设置fetchSize为-2147483648来实现流式查询。综上所述,查询MySQL大量数据时,可以结合以上的优化策略来提高查询性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PHP查询MySQL大量数据的时候内存占用分析](https://download.csdn.net/download/weixin_38632763/13065449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MySQL 大表优化方案](https://blog.csdn.net/cc_1209/article/details/102665446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MySQL数据查询方案](https://blog.csdn.net/qq_19922839/article/details/126411574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值