当我需要从上传的CVS文件更新我的db表(大约100000-500000行)时,我有批处理过程。通常需要20-30分钟,有时甚至更长。
最好的方法是什么?对此有什么好的做法?任何建议将不胜感激
感谢。
答案 0 :(得分:7)
从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预先转换它,或者将其加载到“staging”表中,让MySQL处理必要的转换 - 以哪个为准更快更方便。
作为一个额外选项,似乎有可能通过MySQL Native Driver for PHP (MYSQLND)异步运行MySQL查询。也许你也可以探索这个选项。它可以让你保持快速的UI性能。
答案 1 :(得分:1)
如果您正在进行大量插入,那么您是否正在进行批量插入?就像这样:
INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (....
这将大大加快插入速度。
您可以做的另一件事是在进行更改时禁用索引,然后在完成后让它一次性重建索引。
关于你正在做什么的更多细节,你可能会得到更多的想法
答案 2 :(得分:1)
答案 3 :(得分:1)
我们在一个大型应用程序中有这样的功能。我们遇到了将csv中的数百万行插入到包含9个索引的表中的问题。经过大量的重构后,我们发现插入数据的理想方法是使用mysql LOAD DATA INFILE命令将其加载到[临时]表中,在那里进行转换并将带有多个插入查询的结果复制到实际表中( INSERT INTO ... SELECT FROM
)每次查询只处理50k行左右(表现优于发布单个插入但YMMV)。
答案 4 :(得分:0)
我不能用cron做,因为这是在用户控制下,用户点击进程按钮,稍后可以查看日志以查看进程状态
当用户按下所述按钮时,在数据库的表中设置一个标志。然后让你的cron作业检查这个标志。如果它在那里,开始处理,否则不。我适用,您可以使用相同的表格发布某种状态更新(例如,xx%已完成),因此用户可以获得有关进度的一些反馈。