php查询mysql大量数据造成内存不足的解决方法


Posted in PHP onMarch 04, 2015

本文实例分析了php查询mysql大量数据造成内存不足的解决方法。分享给大家供大家参考。具体分析如下:

一、问题

使用php查询mysql大数据量的时候,程序尚未执行完毕,跳出警告:
Fatal error:  Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes)
错误提示:php所分配到的100M内存被占用完毕。

二、解决方法:

最简单的解决办法是:在执行文件的头部增加:

ini_set('memory_limit','256M');

把内存增加到256M或者更多,可以增大php所使用的内存空间
但是下次若要读取更多的数据该怎么办呢,总不能一次次的增加,导致服务器的内存都被php吃光。

这里介绍一个函数:

使用memory_get_usage()方法获得php使用的内存量。发现随着读取数据条数的增加,php使用的内存在一步步增加。
难道php在查询mysql时的数据是存在内存中的?搜索了一下,发现果真大概就是这个意思。
mysql的C API函数有mysql_use_result()和mysql_store_result()
mysql_store_result()会把结果集从mysqlServer读到客户端,而 mysql_use_result()只是读取了结果集的元信息

1、php的mysql_query调用的是mysql_store_result(),自动获取并缓存结果集
2、而php的另一个函数mysql_unbuffered_query()则是调用的 mysql_use_result(),一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。

所以我们在读取大量数据的时候,可以使用mysql_unbuffered_query()来替代mysql_query()。经测试,的确如此。而且相当给力,导完所有数据内存一直保持在1MB以内,没有增长过
mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query()那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier。
mysql_unbuffered_query()的好处是有代价的:在 mysql_unbuffered_query()返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。
所以一定要结合自己的业务需求适当的选取函数

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
php for 循环语句使用方法详细说明
May 09 PHP
php 带逗号千位符数字的处理方法
Jan 10 PHP
php类常量的使用详解
Jun 08 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
php获取当前页面完整URL地址
Dec 30 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 #PHP
PHP获取POST数据的几种方法汇总
Mar 03 #PHP
php函数实现判断是否移动端访问
Mar 03 #PHP
php中instanceof 与 is_a()区别分析
Mar 03 #PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 #PHP
ecshop 2.72如何修改后台访问地址
Mar 03 #PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 #PHP
You might like
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
Python实现约瑟夫环问题的方法
2016/05/03 Python
python 性能提升的几种方法
2016/07/15 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
Django密码系统实现过程详解
2019/07/19 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Python库安装速度过慢解决方案
2020/07/14 Python
Python学习之time模块的基本使用
2021/01/17 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
Html5定位终极解决方案
2020/02/05 HTML / CSS
大一军训感言
2014/01/09 职场文书
端午节演讲稿
2014/05/23 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL