最佳实践是,使用PHP尽可能快地导入数据提要并下载每行的图像

最佳实践是,使用PHP尽可能快地导入数据提要并下载每行的图像,php,mysql,Php,Mysql,我有多个CSV文件(目前为150k-500k行),其中包含要导入MySQL数据库的数据 这是我目前的工作流程: 将文件导入到数据库中的临时表(原始行) 每次选择一行,将其分解为数组,清理并导入 每个项目都有一个图像,我使用curl下载它。下载后,我用codeigniters resizer(gd2)调整大小。这两个步骤都是绝对必要的,而且需要时间。我想(需要)每天删除并重新导入新文件,以保持内容新鲜 临时数据库保存的原因是,如果我可以使用crontab生成导入脚本的多个实例,那么就可以使用se。

我有多个CSV文件(目前为150k-500k行),其中包含要导入MySQL数据库的数据

这是我目前的工作流程:

  • 将文件导入到数据库中的临时表(原始行)
  • 每次选择一行,将其分解为数组,清理并导入
  • 每个项目都有一个图像,我使用curl下载它。下载后,我用codeigniters resizer(gd2)调整大小。这两个步骤都是绝对必要的,而且需要时间。我想(需要)每天删除并重新导入新文件,以保持内容新鲜

    临时数据库保存的原因是,如果我可以使用crontab生成导入脚本的多个实例,那么就可以使用se。这并没有给我想要的结果

    你对我如何以“快速”的方式实现这一点有什么设计想法吗

    该站点运行在4GB 1.8 Ghz双核专用服务器上


    谢谢:)

    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中的数据,因为每个文件中都有多个供应商的结构略有不同。可悲的是,我认为图像是真正的瓶颈,也是主要信息:(