mysql 大数据量查询

1 内存耗尽问题

Allowed memory size of xxx bytes exhausted

查询大量数据的,如果出现如下情况,就说明最大内存已经耗尽:

普通解决方案

可临时修改脚本使用内存大小进行处理:

 ini_set ( 'memory_limit' , '2048M' );

2 内存到达瓶颈之后就需要考虑采用非缓冲模式了

缓冲模式

  • 默认情况下,查询使用缓冲模式

  • 数据库的查询结果会从Mysql服务器传输到PHP,保存在进程内存中.而且结果集在没有释放之前需要相当多的内存来保存,空间换速度.

  • 缓冲模式由于整个结果集一次存储,所以很方便的进行计数,遍历,指针移动等操作.

注意:
当使用libmysqlclient作为库时,PHP的内存限制将不会计算用于结果集的内存,除非将数据读入PHP变量。与mysqlnd的内存占用将包括完整的结果集。

无缓冲模式

  • 无缓冲的MySQL查询执行查询,同时数据等待从MySQL服务器进行获取。
  • PHP端使用较少的内存,但增加服务器上的负载。

由于缓冲查询是默认的,下面的示例将演示如何使用每个API执行无缓冲的查询。

无缓冲查询示例:mysqli

query("SELECT Name FROM City", MYSQLI_USE_RESULT);

if ($uresult) {
   while ($row = $uresult->fetch_assoc()) {
       echo $row['Name'] . PHP_EOL;
   }
}
$uresult->close();
?>

无缓冲查询示例:pdo_mysql

setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
   while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
       echo $row['Name'] . PHP_EOL;
   }
}
?>

无缓冲查询示例:mysql


你可能感兴趣的:(mysql 大数据量查询)