Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带有许多查询的导入脚本会导致网站运行缓慢_Php_Mysql_Xml_Import_Export - Fatal编程技术网

Php 带有许多查询的导入脚本会导致网站运行缓慢

Php 带有许多查询的导入脚本会导致网站运行缓慢,php,mysql,xml,import,export,Php,Mysql,Xml,Import,Export,我们为我们的离线计划建立一个链接到我们的网站。在我们的离线程序中,我们有50000条记录要推送到我们的网站上。我们现在要做的是: 在离线程序中,我们构建了一个包含1500条记录的xml文件,并将其发布到Web服务器上的php文件中。在Web服务器上,我们读取xml并将其推送到mysql数据库,在此之前,我们首先检查记录是否已经存在,然后更新记录或将其作为新记录插入 完成后,我们将向脱机程序返回一条消息,说明批处理已完成。脱机程序将构建一个包含1500条记录的新xml文件。此过程重复进行,直到达到

我们为我们的离线计划建立一个链接到我们的网站。在我们的离线程序中,我们有50000条记录要推送到我们的网站上。我们现在要做的是:

在离线程序中,我们构建了一个包含1500条记录的xml文件,并将其发布到Web服务器上的php文件中。在Web服务器上,我们读取xml并将其推送到mysql数据库,在此之前,我们首先检查记录是否已经存在,然后更新记录或将其作为新记录插入

完成后,我们将向脱机程序返回一条消息,说明批处理已完成。脱机程序将构建一个包含1500条记录的新xml文件。此过程重复进行,直到达到最后1500条记录

问题是Web服务器在将记录推送到数据库时变得非常慢。可能这是因为我们首先检查已经存在的记录(这是一个查询),然后将其写入数据库(这是第二个查询)。因此,对于每个批次,我们必须运行3000个查询

我希望你们有一些技巧来加速这个过程


提前谢谢

阅读一些关于Mysql唯一索引约束的信息。这将有助于:


阅读一些有关Mysql唯一索引约束的信息。这将有助于:

  • 在开始导入之前,读取您拥有的所有数据ID,不要对每个项目插入进行检查查询,而是在现有的php数组中进行检查
  • 修复数据库表上的键
  • 在一个请求上进行所有插入,或使用事务
  • 以这种方式导入大量数据没有问题,我对此有很多经验

  • 在开始导入之前,读取您拥有的所有数据ID,不要对每个项目插入进行检查查询,而是在现有的php数组中进行检查
  • 修复数据库表上的键
  • 在一个请求上进行所有插入,或使用事务

  • 以这种方式导入大量数据是没有问题的,我在这方面有很多经验。

    我在4个月前也遇到过同样的问题,我用java而不是php进行了更高性能的编码,并且避免使用xml文档。 我的小贴士:您可以读取整个表(如果您只读取一次,比逐个进行多个查询要快),并将该表保存在内存中(例如,在HashMap中)。在插入记录之前,您可以检查它是否存在于您的本地结构中(您不必麻烦数据库)。
    您可以通过这种方式提高性能。

    我在4个月前也遇到了同样的问题,我用java而不是php编写了更多的性能代码,并且避免使用xml文档。 我的小贴士:您可以读取整个表(如果您只读取一次,比逐个进行多个查询要快),并将该表保存在内存中(例如,在HashMap中)。在插入记录之前,您可以检查它是否存在于您的本地结构中(您不必麻烦数据库)。
    您可以通过这种方式提高性能。

    一个好办法是编写一个查询,由分号分隔的所有insert语句串联而成:

    INSERT INTO table_name
            (a,b,c)
        VALUES
            (1,2,3)
        ON DUPLICATE KEY
            UPDATE a = 1, b = 2, c = 3;
    INSERT INTO table_name
        ...
    
    您可以连接100-500条insert语句并将它们包装到事务中

    将许多语句包装到一个事务中会有所帮助,因为它不会在插入每一行后立即将数据提交到磁盘,它会将整个100-500批保留在内存中,当它们全部完成时,会将它们全部写入磁盘—这意味着更少的间歇性磁盘IO


    你需要找到一个好的批量大小,我举例说明了100-500,但取决于你的服务器配置,关于每条语句的数据量以及插入与更新的数量,您必须对其进行微调。

    一个好办法是编写一个由分号分隔的所有插入语句串联而成的查询:

    INSERT INTO table_name
            (a,b,c)
        VALUES
            (1,2,3)
        ON DUPLICATE KEY
            UPDATE a = 1, b = 2, c = 3;
    INSERT INTO table_name
        ...
    
    您可以连接100-500条insert语句并将它们包装到事务中

    将许多语句包装到一个事务中会有所帮助,因为它不会在插入每一行后立即将数据提交到磁盘,它会将整个100-500批保留在内存中,当它们全部完成时,会将它们全部写入磁盘—这意味着更少的间歇性磁盘IO


    您需要找到一个好的批量大小,我举例说明了100-500,但根据您的服务器配置、每条语句的数据量以及插入与更新的数量,您必须对其进行微调。

    您好,Mihai,这是否仅适用于具有唯一键的字段?就我所知,是的,取决于重复键。因为它依赖于基础引擎停止插入,因为存在唯一性约束。否则它只会继续插入双打。但是您可以定义多列唯一键,您肯定有一种识别正确行的机制,这涉及一个唯一键。您可以使用过程sql IF/ELSE子句。MySQL允许您在不定义过程或函数的情况下使用过程SQL。您好,Mihai,这是否仅适用于具有唯一键的字段?关于重复键,据我所知,是的。因为它依赖于基础引擎停止插入,因为存在唯一性约束。否则它只会继续插入双打。但是您可以定义多列唯一键,您肯定有一种识别正确行的机制,这涉及一个唯一键。您可以使用过程sql IF/ELSE子句。MySQL允许您使用过程SQL,而无需定义过程或函数。