如何解决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(一)
Mar 21 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
php使用CutyCapt实现网页截图保存的方法
Oct 03 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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 zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php合并js请求的例子
2013/11/01 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
Js的MessageBox
2006/12/03 Javascript
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
Python爬豆瓣电影实例
2018/02/23 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
python基于递归解决背包问题详解
2019/07/03 Python
python 日期排序的实例代码
2019/07/11 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python中实现输入一个整数的案例
2020/05/03 Python
浅析Python面向对象编程
2020/07/10 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
Skyscanner波兰:廉价航班
2017/11/07 全球购物
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
安全生产投入制度
2014/01/29 职场文书
精彩广告词大全
2014/03/19 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
大学生在校表现评语
2014/12/31 职场文书
教师节祝酒词
2015/08/11 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL