如何解决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 日期时间处理函数小结
Dec 18 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
php获取新浪微博数据API实例
Nov 12 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
php 邮件发送问题解决
Mar 22 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
PHP tp5中使用原生sql查询代码实例
Oct 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
数字转英文
2006/12/06 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
2014/03/18 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
详解angularJS+Ionic移动端图片上传的解决办法
2017/09/13 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
js闭包和垃圾回收机制示例详解
2021/03/01 Javascript
python动态性强类型用法实例
2015/05/09 Python
python daemon守护进程实现
2016/08/27 Python
python实现12306火车票查询器
2017/04/20 Python
Python中property属性实例解析
2018/02/10 Python
Python3进制之间的转换代码实例
2019/08/24 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
全球性的女装店:storets
2019/06/12 全球购物
工会主席事迹材料
2014/06/03 职场文书
课外活动总结范文
2014/07/09 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
船舶调度指挥系统——助力智慧海事
2022/02/18 无线电