PHP Foreach 大数据

Posted

技术标签:

【中文标题】PHP Foreach 大数据【英文标题】:PHP Foreach large data 【发布时间】:2014-03-20 11:41:39 【问题描述】:

有一个mysql表有24500行数据,有一个文本文件有26000串数据需要插入到MySQL中,问题是这26000个字符串是什么重复了MySQL表中的数据,所以我们需要比较它们,并且只插入新的/唯一的。

cadastreArray - 来自文本文件的数组

districtArray - mysql 数组

当我尝试做时

foreach ($cadastreArray as $cadastreValue) 
    $districtExist = false;
    foreach ($districtArray as $districtData) 
        if ($cadastreValue[0] == $districtData['1']) 
            $districtExist = true;
            break;
        
    


if(!$districtExist)  MySQL INSERT ... 

我收到执行时间错误,甚至 3 分钟都不够。 也许您可以提供更好/更快的方法?

【问题讨论】:

在数据库级别进行比较。或者分离过程。执行前 10k 行时,尝试新的 10k,然后尝试新的(直到结束) 【参考方案1】:

也许您可以将 mysql 字段设置为唯一的,这样当您要插入时,它不会插入,而是会生成错误号并继续执行。所以你不需要比较。

你可以做的另一件事是你可以增加 php.ini 中的 max_execution_time

【讨论】:

除此之外,如果您需要在找到唯一值时更新任何其他字段(例如,上次检查的日期),请查看 ON DUPLICATE KEY UPDATE。【参考方案2】:

另一种选择。将 26k 文本文件加载到临时表中(LOAD DATA INFILE... 会很快完成)。

然后您可以根据查询执行插入操作,该查询将您的临时表和 LEFT JOIN 与您的完整表进行对比,检查完整表上的字段是否为 NULL。

这里的简单示例脚本:-

<?php

$file = "SomeTextFile.txt";

$sql = "CREATE TEMPORARY TABLE cadastre
(
    field1 INT,
    field2 VARCHAR(255),
    etc...
)";

if(!($db->query($sql)))

    die($db->error());// if error, stop script


if(!($db->query("LOAD DATA INFILE '$file' INTO TABLE cadastre")))

    die($db->error());// if error, stop script


$sql = "INSERT INTO district (field1, field2, field3, ......)
        SELECT a.field1, a.field2, a.field3
        FROM cadastre a
        LEFT OUTER JOIN district b
        ON a.field1 = b.field1
        WHERE b.field1 IS NULL";

if(!($db->query($sql)))

    die($db->error());// if error, stop script


?>

确保临时表和您要插入的表添加了有用的索引。

【讨论】:

以上是关于PHP Foreach 大数据的主要内容,如果未能解决你的问题,请参考以下文章

php foreach循环大的数据量,在其执行1个多小时后就中断了?有可能是啥原因?

mysql insert foreach 大数据量 重复

php批量修改数据

2021年大数据常用语言Scala(二十一):函数式编程 遍历 foreach

php怎么导出大量数据的Excel

对于 R 中的大迭代,foreach 循环变得不活动