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

<?php
$mysqli  = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $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

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->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

<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db   = mysql_select_db("world");

$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
   while ($row = mysql_fetch_assoc($uresult)) {
       echo $row['Name'] . PHP_EOL;
   }
}
?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 看了一些关于MySQL查询的优化方法,发现MySQL的优化最离不开的就是索引,还有其他优化的小建议。 查询方法: ...
    郑在学_blog阅读 9,155评论 0 1
  • 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性...
    CaesarXia阅读 11,876评论 1 30
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,958评论 19 139
  • 写在前面: 之所以有这种想法,是因为在网上看了一篇帖子。具体内容记不清了,大意是说卸载微信之类的社交软件之后,一个...
    江厘阅读 910评论 10 8
  • 小时候我很叛逆,也不知道为什么老哭,老气人。妈妈也挺能发狠的。都不知道被妈妈一只手拎着扔进村口那个废弃的干涸了的大...
    稚童千阳阅读 220评论 0 0