web开发中如果遇到php查询mysql返回大量数据导致内存溢出、或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况?

答案是: mysql_query 和 mysql_unbuffered_query 两个函数

首先来分析一个典型的实例:在执行下面的代码的时候就会导致php请求mysql返回结果太多(10W以上)导致PHP内存不够用。

while ($row = mysql_fetch_assoc($result))

{

// …

}

对于上面的问题来讲,首先要从mysql的原理上来分析 MySQL是经典的C/S(Client/Server, 客户端/服务器)模型, 在遍历结果集之前, 底层的实现可能已经把所有的数据通过网络(假设使用TCP/IP)读到了Client的缓冲区, 也有另一种可能, 就是数据还在Server端的发送缓冲区里, 并没有传给Client。

通过查看php和mysql的源码中发现两个相似的mysql函数:mysql_query() 和mysql_unbuffered_query(),

发现前一个函数执行时, 会把所有的结果集从Server端读到Client端的缓冲区中, 而后一个则没有, 这就是“unbuffered(未缓冲)”的意思。也就是说, 如果用mysql_unbuffered_query() 执行了一条返回大量结果集的SQL语句, 在遍历结果之前, PHP的内存是没有被结果集占用的。 而用mysql_query() 来执行同样的语句的话, 函数返回时, PHP的内存占用便会急剧增加, 立即耗光内存。
PHP_FUNCTION(mysql_query)
{
     php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
}
PHP_FUNCTION(mysql_unbuffered_query)
{
     php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
}

两个函数都调用了php_mysql_do_query(), 只差了第2个参数的不同, MYSQL_STORE_RESULT和MYSQL_USE_RESULT. 再看php_mysql_do_query()的实现:

if(use_store == MYSQL_USE_RESULT) 
{
     mysql_result=mysql_use_result(&mysql->conn);
}  
else
{
     mysql_result=mysql_store_result(&mysql->conn);
}

mysql_use_result()和mysql_store_result()是MySQL的C API函数, 这两个C API函数的区别就是后者把结果集从MySQL Server端全部读取到了Client端, 前者只是读取了结果集的元信息。

扯远了: 回到刚才的话题使用mysql_unbuffered_query(), 可以避免内存的立即占用, 如果返回的结果存放到array中也是完全没有问题的, 也不会出现php查询mysql数据量过大时导致内存溢出问题.

转载于:https://www.cnblogs.com/mako/p/4156978.html

php查询mysql返回大量数据结果集导致内存溢出的解决方法相关推荐

  1. 接口数据量太大,导致内存溢出,解决办法

    通常我们使用接口调用数据总是返回一段我们需要的信息,或者是json 格式信息,通过接收将数据保存到程序当中,再对接收到的数据进行转换成对应的模型格式 .目前遇到的问题是接收的数据量过于巨大,导致完整接 ...

  2. Python查询mysql返回序列化数据

    文章目录 一.前言 二.实现 一.前言 pymysql 查询返回的数据是 tuple 格式的,取的时候只能用下标取,有点麻烦,下面提供一种牺牲了一些查询速度但是可以直接返回序列化数据的方法 当然 pe ...

  3. 大数据导出Excel导致内存溢出的解决方案

    一.问题描述: 公司之前的项目中客户有一个需求是将业务数据导出到Excel表中,方便他们对账,单个导出任务数据量近100W,每当月初任务量多时,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每个 ...

  4. php查询mysql表里的数据_PHP/MYSQL 查询大数据/遍历表

    PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50) MYSQL:5.1.51 如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录 ...

  5. Django 分页查询并返回jsons数据,中文乱码解决方法

    Django 分页查询并返回jsons数据,中文乱码解决方法 参考文章: (1)Django 分页查询并返回jsons数据,中文乱码解决方法 (2)https://www.cnblogs.com/jo ...

  6. mysql删除数据后id自增不连续的解决方法

    mysql删除数据后id自增不连续的解决方法 参考文章: (1)mysql删除数据后id自增不连续的解决方法 (2)https://www.cnblogs.com/weifeng-888/p/1163 ...

  7. SqlYong连接MySql数据时,出现错误代码2003的解决方法

    问题描述: 在我刚刚安装完SqlYong后,准备用SqlYong连接MySql数据时,出现错误代码2003. 解决方法: MySql没有开始,只需要启动MySql即可. (我的电脑右键-管理-服务  ...

  8. golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法

    golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: ...

  9. 【MySQL】MySQL出现Waiting for table metadata lock的原因、解决方法

    Waiting for table metadata lock MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景 ...

最新文章

  1. Hive之 Hql语法解析
  2. java 反射加实例化内部类
  3. [深度学习] Pytorch中RNN/LSTM 模型小结
  4. 2.24 js处理内嵌div滚动条
  5. 在生产中使用Istio,我们学到了什么?
  6. linux centos设置共享目录,在CentOS上配置SAMBA共享目录
  7. Reading Digits(2016southeastern Europe. D题)题解
  8. html左侧树形图,Qunee for HTML5 - 中文 : 树形布局
  9. Latex(texlive)安装配置教程(详细)
  10. 老年人-傻妞机器人安装及使用教程
  11. 帆软软件FineReport考试题库FCRA题库
  12. 第十四章 相机和音频录制——Qt
  13. Mac 安装 双系统 体验极差的好几天
  14. 数字签密算法JPBC实现
  15. Excel图表坐标轴出现系列1、系列2的解决方案
  16. html粘贴excel表格大小不一样,为什么excel表格粘贴的时候显示因为单元格形状大小不一样无法粘贴呢...
  17. 完全二叉树 满二叉树
  18. 华为视频会议TE40
  19. 阿里云2023届实习生招聘启动啦,快来加入IoT安全吧
  20. 人民链鲍大伟:打破壁垒,建立全域数据治理共享及应用平台

热门文章

  1. 解决列表某项文字过度过多 需要自适应撑开高度展示 其他项目按照行高居中
  2. [react] react中的setState是同步还是异步的呢?为什么state并不一定会同步更新?
  3. [react] Consumer向上找不到Provider的时候怎么办?
  4. [react] contextType是什么?它有什么用?
  5. Taro+react开发(12)--注意引入user
  6. 前端学习(3067):vue+element今日头条管理-频道筛选完成
  7. [html] 列举几种瀑布流布局的方法
  8. [css] 怎么让body高度自适应屏幕?为什么?
  9. [js] 说说你对JSBridge的理解
  10. 工作195:解决key值不唯一的报错