如何解决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+dbfile开发小型留言本
Oct 09 PHP
PHP新手上路(十一)
Oct 09 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
几个有用的php字符串过滤,转换函数代码
May 01 PHP
PHP编码转换函数 自动转换字符集支持数组转换
Dec 16 PHP
浅析PHP 按位与或 (^ 、&)
Jun 21 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
PHP CURL使用详解
Mar 21 PHP
如何在Laravel之外使用illuminate组件详解
Sep 20 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
php Smarty初体验二 获取配置信息
2011/08/08 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
详解angularjs popup-table 弹出框表格指令
2017/09/20 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python 登录网站详解及实例
2017/04/11 Python
Python微信公众号开发平台
2018/01/25 Python
django+mysql的使用示例
2018/11/23 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
python实例化对象的具体方法
2020/06/17 Python
django rest framework 自定义返回方式
2020/07/12 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
乡下人家教学反思
2014/02/01 职场文书
书法比赛获奖感言
2014/02/10 职场文书
走群众路线剖析材料
2014/10/09 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
工作能力自我评价2015
2015/03/05 职场文书
学校党支部承诺书
2015/04/30 职场文书
电力安全学习心得体会
2016/01/18 职场文书