Home  >  Article  >  Backend Development  >  mysql用php怎么分批处理插入?比如前1000条数据处理结束后,再处理1001至2000条,然后再处理2001至3000条……,直到全部处理完毕?

mysql用php怎么分批处理插入?比如前1000条数据处理结束后,再处理1001至2000条,然后再处理2001至3000条……,直到全部处理完毕?

WBOY
WBOYOriginal
2016-06-23 13:44:261251browse

当表 member中数据量不大时,可以一次性执行:

$q="select * from member'";$r=$obj_db->simplequery($q);while($a=$obj_db->fetchrow($r,DB_FETCHMODE_ASSOC)){   $id=$a[id];   $mccd=$a[cca]+$a[ccb];      $query="insert into mingxi (mid,mccd,mtime) values ('$id','$mccd','$time')";   $obj_db->simplequery($query);}


但当member中数据量达到百万条时,说会出现执行超时的错误:
Fatal error: Maximum execution time of 30 seconds exceeded in D:

那么怎么现实分批处理呢,比如前1000条数据处理结束后,再处理1001至2000条,然后再处理2001至3000条……,直到全部处理完毕?

$q="select * from member'";$r=$obj_db->simplequery($q);while($a=$obj_db->fetchrow($r,DB_FETCHMODE_ASSOC)){$i++;$ep=1000;//这里假设处理完第1个1000条后再处理第二个1000条,直至处理结束?   $id=$a[id];   $mccd=$a[cca]+$a[ccb];      $query="insert into mingxi (mid,mccd,mtime) values ('$id','$mccd','$time')";   $obj_db->simplequery($query);}



请高手帮写出详细代码,谢谢!因代码隐藏在后台执行,所以不要考虑用分页一页一页手工去点的方式


回复讨论(解决方案)

可以用 insert into mingxi (mid,mccd,mtime)  select  id, cca+ccb, time from member

 最近处理一些数据 大约56万条,包括每条的读取 计算 处理 和插入

使用一个ajax方法去请求PHP页面,调一个尚未被处理的进行处理,完毕后打上已处理的标记存库,返回到js,  ajax接收到返回以后(可以先输出到页面上)调用自身,再次发起请求

56万条跑了大约10万秒,  页面和程序没死过

虽然很慢,但这跟我的需求(需要把每条数据进行分析处理)有关  而且不会超时什么的.

 最近处理一些数据 大约56万条,包括每条的读取 计算 处理 和插入

使用一个ajax方法去请求PHP页面,调一个尚未被处理的进行处理,完毕后打上已处理的标记存库,返回到js,  ajax接收到返回以后(可以先输出到页面上)调用自身,再次发起请求

56万条跑了大约10万秒,  页面和程序没死过

虽然很慢,但这跟我的需求(需要把每条数据进行分析处理)有关  而且不会超时什么的.



这种方法没法试用异步, 处理完毕的返回值有可能先行返回, 除非是查询一条然后提交一条的方式. 否则有可能会造成数据丢失.
当然如果1天跑完  你两天都没关 应该是没太大问题.


 最近处理一些数据 大约56万条,包括每条的读取 计算 处理 和插入

使用一个ajax方法去请求PHP页面,调一个尚未被处理的进行处理,完毕后打上已处理的标记存库,返回到js,  ajax接收到返回以后(可以先输出到页面上)调用自身,再次发起请求

56万条跑了大约10万秒,  页面和程序没死过

虽然很慢,但这跟我的需求(需要把每条数据进行分析处理)有关  而且不会超时什么的.



这种方法没法试用异步, 处理完毕的返回值有可能先行返回, 除非是查询一条然后提交一条的方式. 否则有可能会造成数据丢失.
当然如果1天跑完  你两天都没关 应该是没太大问题.

为何会先行返回? 没看明白能否举个例子说明下 

$offs = isset($_GET['offs']) ? $_GET['offs'] : 1;$sql = "select * from member limit $offs, 1000";//做你该做的事header("Location: $_SERVER[PHP_SELF]?offs=" . ($offs+1000));

$offs = isset($_GET['offs']) ? $_GET['offs'] : 1;$sql = "select * from member limit $offs, 1000";//做你该做的事header("Location: $_SERVER[PHP_SELF]?offs=" . ($offs+1000));



放在哪里呢?你这个是不是等于不断刷新页面啊?页面中还有一些其它代码,这个页面只能执行一次,谢谢

同问 有解决吗

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn