最佳实践是,使用PHP尽可能快地导入数据提要并下载每行的图像
我有多个CSV文件(目前为150k-500k行),其中包含要导入MySQL数据库的数据 这是我目前的工作流程:最佳实践是,使用PHP尽可能快地导入数据提要并下载每行的图像,php,mysql,Php,Mysql,我有多个CSV文件(目前为150k-500k行),其中包含要导入MySQL数据库的数据 这是我目前的工作流程: 将文件导入到数据库中的临时表(原始行) 每次选择一行,将其分解为数组,清理并导入 每个项目都有一个图像,我使用curl下载它。下载后,我用codeigniters resizer(gd2)调整大小。这两个步骤都是绝对必要的,而且需要时间。我想(需要)每天删除并重新导入新文件,以保持内容新鲜 临时数据库保存的原因是,如果我可以使用crontab生成导入脚本的多个实例,那么就可以使用se。
谢谢:)MySQL有一个名为
加载数据填充的功能,它完全可以完成您听起来想要做的事情
从这个问题来看,不清楚您是否已经在使用它了?但即使你是,听起来你也可以改进你的工作方式
这样的SQL脚本可能适合您:
LOAD DATA INFILE filename.csv
INTO table tablename
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(
field1,
field2,
field3,
@var1,
@var2,
etc
)
SET
field4 = @var1 / 100,
field5 = (SELECT id FROM table2 WHERE name=@var2 LIMIT 1),
etc
这是一个相当复杂的示例,演示了如何将CSV数据直接导入到表中,并一次性将其转换为正确的格式
最棒的是它实际上非常快。我们使用它每周导入500000个记录文件,比PHP程序读取文件并写入数据库快几个数量级。我们确实从PHP程序运行它,但PHP不负责任何导入;MySQL从一个查询本身就完成了所有工作
在我们的例子中,即使我们对导入数据进行了大量操作,我们仍然将其写入临时表,因为在它进入主表之前,我们还有十几个进一步的处理步骤。但在您的情况下,听起来这个方法可以让您完全不用使用临时表
MySQL手册页:
至于下载图像,我不知道你如何加快下载速度,除了关注哪些导入的记录已经更新,并且只获取已更改记录的图像。但我猜如果这是一个可行的解决方案,那么你可能已经在做了
不过,我还是希望MySQL的建议能有所帮助。最快的方法就是使用线程
我建议两名工作人员,一名连接MySQL,另一名下载并调整图像大小,打开CSV,使用fgets或其他方式读取,每行创建一个可堆叠文件,插入数据库,将该可堆叠文件传递给另一个可下载文件的工作人员(并知道存储数据的行的ID)并调整其大小。您可能希望为图像雇佣多个工人
(请务必参考docs.php.net,文档构建有点落后)
(可在索引中找到事物如何工作的基本分类)
(如果要在本地进行测试,可在此下载windows)
(上一个版本有点过时)如果您正在学习“生成导入脚本的多个实例”,您可能需要了解如何设置作业服务器来处理数据。谢谢cillosis,我将查看它:)您好,谢谢您的详细回答。我没有使用加载数据填充函数,我会尝试一下。我需要处理每个CSV中的数据,因为每个文件中都有多个供应商的结构略有不同。可悲的是,我认为图像是真正的瓶颈,也是主要信息:(