如何解决PHP使用mysql_query查询超大结果集超内存问题


Posted in PHP onMarch 14, 2016

再使用mysql_query查询超大结果集的时候会出现超出内存限制的致命错误,这是因为mysql_query采用的是查询全部结果然后把结果集全部缓存到内存中的方式。

mysql的查询还提供了另外一种查询方式,函数名为mysql_unbuffered_query,这个函数采用的是查出结果后立即操作结果集,并不会把结果集缓存到内存中,这样就避免了超出内存的情况发生。但是使用这个方法的代价就是不能再查询的时候使用获取总行之类的方法,因为这种方法是便查询边返回结果。同时在使用该方法的时候不能在同一数据库链接上执行其他的操作,想要执行其他操作的时候必须先终止当前操作,释放所有未缓存的sql查询所产生的结果行,或者重新实例化一个数据库连接,使用新链接进行其他操作。

以下是使用缓存和不使用缓存的对比(所查询的表中有1000多万行数据):

function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo->prepare('select * from test');
$sth->execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth->fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i > 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e->getMessage();
}
}

上面使用到的是缓存所有结果集的方式,运行该函数时将会报超内存的错误,如下所示:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 57

Call Stack:

0.0005 135392 1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
0.0005 135568 2. test->selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:86
0.0055 142528 3. PDOStatement->execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:57

在执行$sth->execute();时超出内存限制;

将// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);这行的注释去掉后将使用不缓存结果集的方式,运行该函数将输出以下内容:

最初占用内存大小:144808

Array
(
[id] => 1
[a] => v
[b] => w
[c] => i
)

占用内存大小:145544

Array
(
[id] => 2
[a] => b
[b] => l
[c] => q
)

占用内存大小:145544

Array
(
[id] => 3
[a] => m
[b] => p
[c] => h
)

占用内存大小:145536

Array
(
[id] => 4
[a] => j
[b] => i
[c] => b
)

占用内存大小:145536

Array
(
[id] => 5
[a] => q
[b] => g
[c] => g
)

占用内存大小:145536

可以看到,使用不缓存结果集的方式获取一行结果所占用的内存是极少的。这样就结局了超出内存限制的问题。

PHP 相关文章推荐
PHP中for循环语句的几种变型
Nov 26 PHP
Php Cookie的一个使用注意点
Nov 08 PHP
php 无限级数据JSON格式及JS解析
Jul 17 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
优化php效率,提高php性能的一些方法
Mar 24 PHP
PHP计数器的实现代码
Jun 08 PHP
两千行代码的PHP学习笔记汇总
Oct 05 PHP
Yii学习总结之安装配置
Feb 22 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 #PHP
PHP访问数据库集群的方法小结
Mar 14 #PHP
php 无限级分类 获取顶级分类ID
Mar 13 #PHP
PHP实现文件上传与下载实例与总结
Mar 13 #PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 #PHP
PHP批量去除BOM头内容信息代码
Mar 11 #PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 #PHP
You might like
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
Vue实现验证码功能
2019/12/03 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
Python3实现生成随机密码的方法
2014/08/23 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python中一行和多行import模块问题
2018/04/01 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python日志器使用方法及原理解析
2020/09/27 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
化妆品促销方案
2014/02/24 职场文书
开业庆典主持词
2014/03/21 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
旅游项目合作意向书
2015/05/08 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
win10搭建配置ftp服务器的方法
2022/08/05 Servers