[英]How to do long time batch processes in PHP?
当我需要从上载的CVS文件更新大约100000-500000行的数据库表时,我具有批处理过程。 通常需要20到30分钟,有时会更长。
最好的方法是什么? 有什么好的做法吗? 任何建议将不胜感激
谢谢。
从CSV导入500.000行需要30分钟?
您是否考虑过让MySQL做艰苦的工作? 有LOAD DATA INFILE
,它支持处理CSV文件:
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
如果文件的形状不正确,无法直接导入目标表,则可以使用PHP预先对其进行转换,也可以将其加载到“暂存”表中,然后让MySQL处理必要的转换-以更快和更快速的方式进行。更方便。
作为附加选项,似乎有可能通过用于PHP的MySQL本机驱动程序(MYSQLND)异步运行MySQL查询。 也许您也可以探索该选项。 这将使您能够保留快速的UI性能。
如果您要进行大量插入,是否要进行批量插入? 即像这样:
INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (....
这将大大加快插入速度。
您可以做的另一件事是在进行更改时禁用索引编制,然后在完成后立即一次性重建索引。
有关您正在做的事情的更多细节,您可能会得到更多的想法
在大型应用程序中,我们具有类似的功能。 我们遇到了将csv中的数百万行插入具有9个索引的表中的问题。 经过大量重构后,我们发现插入数据的理想方法是使用mysql LOAD DATA INFILE命令将其加载到[临时]表中,在其中进行转换,然后将具有多个插入查询的结果复制到实际表中( INSERT INTO ... SELECT FROM
)每个查询仅处理50k行左右(比发出单个插入但YMMV要好)。
我无法使用cron做到这一点,因为这是在用户控制之下的,用户单击进程按钮,以后可以检查日志以查看进程状态
当用户按下所述按钮时,在数据库的表中设置一个标志。 然后让您的Cron作业检查此标志。 如果存在,请开始处理,否则不进行。 如果适用,您可以使用同一张表发布某种状态更新(例如xx%完成),以便用户对进度有一些反馈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.