php发展

首页 » 常识 » 预防 » 面试PHP对MySQL的缓冲查询和无
TUhjnbcbe - 2025/7/25 17:14:00
SEO百度优化求职微信群 http://www.cgia.cn/news/chanye/1663511.html

PHP查询大量数据内存耗尽问题的解决方法:PHPFatalerror:Allowedmemorysizeofbytesexhausted

缓冲查询:将接收查询的结果并把他们存储在客户端的缓存中,而且接下来获取行记录的请求仅仅从本地内获取。提供一个全面的寻找加速。因为每一个单独的查询的都会快读结束,mysql快速的获取结果集并存放在内存中,而不是在处理PHP代码时保持查询为可用的

(1)优点:可以在结果集中自由地移动“当前行”的指针,这样很容易找到,因为结果是存在客户端的。

(2)缺点:需要额外的内存来存储这些结果集,而且需要大量的内存,另外,php中用来运行查询的函数会一直到所有的结果都接收才会返回值。

无缓冲查询:

会限制你通过严格的顺序访问查询结果。但他不需要额外的内存来存储整个结果集。你可以在MySQL服务器开始返回值的时候就开始获取而处理或显示数据行。当使用无缓冲结果集时,必须使用mysql_fetch_row函数获取所以的数据行,或者在给服务器发送其他任何命令前用mysql_free_result函数关闭结果集。

无缓冲查询在结果集巨大的时为你节省大量的临时内存,而且查询不需要排序时,php在MySQL数据库实际上还在处理时就可以获得第一个数据行。

缓冲查询和非缓冲查询-----缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。

1)缓冲查询:PHP的查询缺省模式是缓冲模式,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能。

2)[推荐]非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回

1非缓冲查询方法一:mysqli

?php

$mysqli=newmysqli(localhost,my_user,,world);

$uresult=$mysqli-query(SELECTNameFROMuser,MYSQLI_USE_RESULT);

if($uresult){

while($row=$uresult-fetch_assoc()){

echo$row[Name].PHP_EOL;

}

}

$uresult-close();

?

2.  非缓冲查询方法二:pdo_mysql

?php

$pdo=newPDO(mysql:host=localhost;dbname=world,my_user,my_pass);

$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);

$uresult=$pdo-query(SELECTNameFROMCity);

if($uresult){

while($row=$uresult-fetch(PDO::FETCH_ASSOC)){

echo$row[Name].PHP_EOL;

}

}

3

非缓冲查询方法三:mysql

?php

$conn=mysql_connect(localhost,my_user,my_pass);

$db=mysql_select_db(world);

$uresult=mysql_unbuffered_query(SELECTNameFROMCity);

if($uresult){

while($row=mysql_fetch_assoc($uresult)){

echo$row[Name].PHP_EOL;

}

总结:

1)当结果集不大时,或者需要在读取所有行前获取结果集行数时,使用缓冲查询(默认).

2)当结果集很大时,使用无缓冲查询,避免PHP进程占用大量的内存.

1
查看完整版本: 面试PHP对MySQL的缓冲查询和无