0

当我需要从上传的 CVS 文件更新我的数据库表时,我有批处理,大约 100000-500000 行。通常需要 20-30 分钟,有时会更长。

最好的方法是什么?有什么好的做法吗?任何建议将不胜感激

谢谢。

4

5 回答 5

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 预先对其进行转换,或者将其加载到“暂存”表中并让 MySQL 处理必要的转换——以更快和更方便。

作为一个附加选项,似乎可以通过MySQL Native Driver for PHP (MYSQLND)异步运行 MySQL 查询。也许您也可以探索该选项。它将使您能够保持快速的 UI 性能。

于 2009-05-10T09:17:20.200 回答
1

如果您要进行大量插入,您是在进行批量插入吗?即像这样:

INSERT INTO table (col1 col2) VALUES (val1a, val2a), (val1b, val2b), (....

这将大大加快插入速度。

您可以做的另一件事是在进行更改时禁用索引,然后在完成后让它一次性重建索引。

关于你在做什么的更多细节,你可能会得到更多的想法

于 2009-05-10T09:13:12.550 回答
1

PEAR有一个名为Benchmark的包,它有一个 Benchmark_Profiler 类,可以帮助您找到代码中最慢的部分,以便您进行优化。

于 2009-05-10T09:13:16.780 回答
1

我们在一个大型应用程序中拥有类似的功能。我们遇到了将 csv 中的数百万行插入到具有 9 个索引的表中的问题。经过大量重构后,我们发现插入数据的理想方法是使用 mysql LOAD DATA INFILE命令将其加载到 [临时] 表中,在那里进行转换并将多个插入查询的结果复制到实际表 ( INSERT INTO ... SELECT FROM) 处理中每个查询只有 50k 行左右(这比发出单个插入但 YMMV 执行得更好)。

于 2009-05-10T09:15:42.950 回答
0

我不能用 cron 来做,因为这是在用户控制之下,用户单击进程按钮,稍后可以检查日志以查看进程状态

当用户按下所述按钮时,在数据库的表中设置一个标志。然后让你的 cron 作业检查这个标志。如果它在那里,开始处理,否则不要。我适用,您可以使用同一张表发布某种状态更新(例如完成 xx%),以便用户对进度有一些反馈。

于 2009-05-10T11:28:40.837 回答