PHP_MYSQL查询大数据遍历表
2019-03-10 浏览:210次 作者:成都晨宇网络科技公司
如果我们有的一张表有几百万或几千万的记录,我们要使用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查询所产生的结果行。
注:成都晨宇网络科技公司自由网络,专业提供网站推广服务,有需要咨询欢迎联系我们在线客服。