html5中文学习网

您的位置: 首页 > 网络编程 > PHP编程 » 正文

PHP/MYSQL 查询大数据/遍历表_PHP教程_编程技术

[ ] 已经帮助:人解决问题

  PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50)PJaHTML5中文学习网 - HTML5先行者学习网

  MYSQL:5.1.51PJaHTML5中文学习网 - HTML5先行者学习网

  如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录都获取过来(遍历数据表)进行处理。查询语句:PJaHTML5中文学习网 - HTML5先行者学习网

  SELECT * FROM largetable;PJaHTML5中文学习网 - HTML5先行者学习网

  PS:为了证明上面的做法是最佳的办法,我尝试使用 largetable 中的一个字段做 where ,以及 LIMIT,OFFSET 。上面那种 WHERE 获得结果很慢,虽然用了索引。后面这种 LIMIT 可以让你有一种想死的感觉(有兴趣可以了解下,《分页优化》)。PJaHTML5中文学习网 - HTML5先行者学习网

  以 MYSQL 以及PDO_MYSQL 为例,尝试直接使用以下代码,必然会出现超内存的情况:PJaHTML5中文学习网 - HTML5先行者学习网

  $result = mysql_query($sql);PJaHTML5中文学习网 - HTML5先行者学习网

  while ($rowset = mysql_fetch_assoc($mysql)) {PJaHTML5中文学习网 - HTML5先行者学习网

  ...PJaHTML5中文学习网 - HTML5先行者学习网

  $stmt = $dbh->prepare($sql);PJaHTML5中文学习网 - HTML5先行者学习网

  $stmt->execute();PJaHTML5中文学习网 - HTML5先行者学习网

  while ($row = $stmt->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {PJaHTML5中文学习网 - HTML5先行者学习网

  ...PJaHTML5中文学习网 - HTML5先行者学习网

  原因在于在查询执行后,PHP 的MYSQL、PDO_MYSQL 将查询结果全部缓存到了客户端,也就是 PHP 执行所在机器上。这样如果我们要 SELECT * FROM LARGETABLE 查询的记录在 百万以上的时候 ,缓存的结果就会非常大,超出 PHP 使用内存。所以为了避免这样情况就需要关闭客户端的缓存。PJaHTML5中文学习网 - HTML5先行者学习网

  这里提供二个测试脚本,分别为 MYSQL、PDO_MYSQL 关闭缓存后查询样例。点击下载:mysql_queryPJaHTML5中文学习网 - HTML5先行者学习网

  以下是 PDO_MYSQL 在查询 ~100W 以及 ~200W (540M)数据结果(因为我的 PHP 内存使用设置了1G所以没挂:) )PJaHTML5中文学习网 - HTML5先行者学习网

  可以很明显的看出在缓存结果后占用内存惊人…,当我们处理千万数据的时候必挂。PJaHTML5中文学习网 - HTML5先行者学习网

/

  以下是 PDO_MYSQL 关闭缓存查询 ~200W 的数据结果。这下处理千万以及E级的数据的时候,对内存表示很淡定。PJaHTML5中文学习网 - HTML5先行者学习网

/

  PS:如果你要处理的数据就几十万,你还是调大点内存好了。比如 MYSQL:PJaHTML5中文学习网 - HTML5先行者学习网

  mysql_unbuffered_query() 的好处是有代价的:在 mysql_unbuffered_query() 返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。PJaHTML5中文学习网 - HTML5先行者学习网

PJaHTML5中文学习网 - HTML5先行者学习网
PJaHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助