2、数据读取时,减少配置数据的加载操作,减少数据查询操作。开始数据转移时,必要的配置数据必须在脚本开始时全部加载进来,不能在转移时用到再去进行查询,由于每次查询都是意味着花费更多韶光。当然这里有个条件是你的机器内存要够大,PHP的这种加载是比较花费内存的。一个脚本运行起来,内存都要占了很多G,这种实在便是用空间换韶光的做法。当然,当机器内存不足大,或者性能不足强时,还是先担保脚本的健壮性,再来考虑性能。
PHP可以利用set_time_limit ( 0 ); @ini_set('memory_limit','2048M');来指定脚本实行的最永劫光和利用内存的最大值;
3、脚本处理数据时,须要分段分批处理。我们在处理数据时,须要先读取出用户id,在根据id查询表的数据再做处理。便是我们的处理逻辑都因此用户id为基准,按照用户id做key,数据做value的办法,遍历数据。为了减少机器的负载,充分利用机器的性能,我们利用一个while循环,每次处理3000个用户的数据,转移完后再查询出3000个用户的数据,如此类推,直到所有数据处理完,也便是跳出while循环。

同时必须要担保数据的有效性,不然insert不进去。这里还碰着过一个问题,便是在利用PHP的函数批量insert数据时,有时一个sql语句数据量太多,会超过MySQL最大的insert限定,以是在insert之前,须要将须要插入的数据进行分段,也便是对数据进行隔断处理,分批插入。PHP中可以利用array_slice()对数组数据进行分段。
4、将多次MySQL处理凑集在一次的commit上。我们在一次循环中是利用了一次try-catch来监控一次操作,当某个数据处理有非常时,就直接抛出非常,担保每次处理数据的完全性。我们每次处理开始前,先开启一个事务,处理完成后会进行一次提交事务。为了节省韶光,可以优化成:开启一个事务,在遍历了多个用户数据后,再进行一次提交,或者在碰着非常后也提交一次,这样可以担保数据完全,也可以减少多次commit db的操作,节约韶光。
5、利用shell脚本整合每个PHP脚本,开启多个PHP进程。由于我们处理一个库的数据要涉及到多个PHP脚本,可以利用shell来整合多个脚本,并且让其顺序实行。利用nohub命令不挂断地运行命令(后面再单独先容这个linux命令)。根据机器的核数来开启多少个PHP进程,充分发挥机器的性能。
例子比如实行一个PHP脚本,可以这样子:
进程1:php move_user.php a 0 10000进程2:php move_user.php a 10000 20000进程3:php move_user.php b 0 10000进程4:php move_user.php b 10000 20000
这样表示利用PHP cli模式(命令模式)实行一个PHP脚本,对付进程1,a 表示是数据库a,0 和10000表示从用户id 0开始,实行到用户id 10000 结束,一个进程处理10000个用户数据。
进程2表示实行数据库a 10000 到20000的用户数据。
这样多个进程,可以同时实行多个库的数据,多个区段的用户数据,节省韶光。
当然,每次处理多少个用户数据,每次开多少个进程,每次遍历多少数据,都是根据项目的业务数据,和机器的最大负载来综合处理,达到一个平衡状态。
总结这次数据处理原来预期要一个小时,结果由于其他缘故原由,后面花费了两个多小时,但整体都是在操持之内,所以是正常的;PHP和MySQL做数据交互,充分利用了PHP的性能后,瓶颈就在与MySQL更新和插入数据了,我们便是通过分段循环处理,分段提交事务来平衡了MySQL的瓶颈;MySQL单表数据太大,后面须要单独对这块进行优化,不然往后对数据进行更新和备份时,都要摧残浪费蹂躏大量的韶光;必须担保脚本逻辑没有问题,不然后面重跑就很蛋疼了。本文首发于 微信公号 「phper的进阶之路」,更多干货,欢迎大家搜索关注!