分享

Knowledge Sharing

PHP_MYSQL查询大数据遍历表

2019-03-10     浏览:206次     作者:成都晨宇网络科技公司

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

    SELECT*FROMlargetable;

    PS:为了证明上面的做法是最佳的办法,我尝试使用largetable中的一个字段做where,以及LIMIT,OFFSET。上面那种

    WHERE获得结果很慢,虽然用了索引。后面这种LIMIT可以让你有一种想死的感觉(有兴趣可以了解下,《分页优化》)。

    以MYSQL以及PDO_MYSQL为例,尝试直接使用以下代码,必然会出现超内存的情况:

    $result=mysql_query($sql);

    while($rowset=mysql_fetch_assoc($mysql)){

    ...

    $stmt=$dbh->prepare($sql);

    $stmt->execute();

    while($row=$stmt->fetch(PDO::FETCH_ASSOC,PDO::FETCH_ORI_NEXT)){

    ...

    原因在于在查询执行后,PHP的MYSQL、PDO_MYSQL将查询结果全部缓存到了客户端,也就是PHP执行所在机器上。这样如果我们要

    SELECT*FROMLARGETABLE查询的记录在百万以上的时候,缓存的结果就会非常大,超出PHP

    使用内存。所以为了避免这样情况就需要关闭客户端的缓存。

    这里提供二个测试脚本,分别为MYSQL、PDO_MYSQL关闭缓存后查询样例。点击下载:mysql_query

    以下是PDO_MYSQL在查询~100W以及~200W(540M)数据结果(因为我的PHP内存使用设置了1G所以没挂:))

    可以很明显的看出在缓存结果后占用内存惊人…,当我们处理千万数据的时候必挂。

    以下是PDO_MYSQL关闭缓存查询~200W的数据结果。这下处理千万以及E级的数据的时候,对内存表示很淡定。

    PS:如果你要处理的数据就几十万,你还是调大点内存好了。比如MYSQL:

    mysql_unbuffered_query()的好处是有代价的:在mysql_unbuffered_query()返回的结果集之上不能使用

    mysql_num_rows()和mysql_data_seek()。此外在向MySQL发送一条新的SQL查询之前,必须提取掉所有未缓存的SQL查询所产生的结果行。


注:成都晨宇网络科技公司自由网络,专业提供网站推广服务,有需要咨询欢迎联系我们在线客服。

网站建设流程

先建设网站,后付款。无预付款
  • 1 、沟通网站建设功能、价格、周期
  • 2 、设计网页效果图
  • 3网站设计效果图确定、沟通、修改
  • 4 、网站开发程序(前台网页和后台管理)
  • 5 、客户浏览确认网站制作完成 95% 以上,付款50%
  • 6 、申请域名空间、备案、修改网站细节
  • 7 、网站上线运行,无任何问题付余款

扫一扫咨询