当我需要从上传的 CVS 文件更新我的数据库表时,我有批处理,大约 100000-500000 行。通常需要 20-30 分钟,有时会更长。
最好的方法是什么?有什么好的做法吗?任何建议将不胜感激
谢谢。
当我需要从上传的 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 处理必要的转换——以更快和更方便。
作为一个附加选项,似乎可以通过MySQL Native Driver for PHP (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%),以便用户对进度有一些反馈。