PHP Foreach大数据

时间:2014-03-20 11:41:39

标签: php mysql query-optimization

有一个包含24500行数据的MySQL表,并且有一个文本文件,需要将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分钟都没有。 也许你可以提供更好/更快的方式?

2 个答案:

答案 0 :(得分:2)

可能您可以将mysql字段设置为唯一,因此当您要插入时,它将不会插入并将生成错误编号并将继续执行。所以你不需要比较。

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

答案 1 :(得分:1)

另一种选择。将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
}

?>

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