快速插入数组/sql


Fast inserting to array/sql

我得到了这个代码

$i             = -1;
$random_string = array();
while (sizeof($random_string) < 1600000) {
    $i++;
    $zmienna           = generatePassword();
    if (!in_array($zmienna, $random_string))
        $random_string[$i] = $zmienna;
    else
        continue;
}
//print_r($random_string);
foreach ($random_string as $value) {
    $sql = "INSERT INTO `kody`(`kod`) VALUES ('$value')";
    mysql_query($sql, $con);
}

但是,将它插入数据库,甚至插入数组需要花费大量的时间。有人知道如何改进这个代码吗?

嗯,in_array()相当昂贵。使用哈希而不是简单数组,然后可以使用isset()而不是in_array()

另外,不要使用sizeof()count()之类的条件作为循环条件。相反,只需使用一个简单的for ($i = 0; $i < 1600000; ++$i) { ... }数组。

根据您的web主机权限,另一个重要的优化是使用fputcsv()将阵列写入磁盘,然后使用MySQL的LOAD DATA INFILE将内容加载到数据库中,而不是生成160万个查询。

是的,使用一个查询通过SQL多重插入同时插入所有查询:

$values = "('" . implode( "'), ('", $random_string) . "')";
$sql="INSERT INTO `kody`(`kod`) VALUES " . $values;
mysql_query($sql,$con);

正如drrcknlsn非常正确地指出的那样,in_array()是低效的,因为它对数组执行线性O(n)搜索。以下是如何修复(这是一个散列实现):

while( sizeof($random_string) < 1600000) {
    $i++;
    $zmienna = generatePassword();
    if( !isset( $random_string[$zmienna]))
        $random_string[$zmienna] = $zmienna;
    else
        continue;
}

现在,您可以使用上面的代码生成一个SQL查询,这应该会运行得更快。

问题可能是它试图在每次插入后更新INDEX。尝试使用事务。这将只更新INDEX一次(在调用COMMIT之后)。如果出现问题,这也会让您ROLLBACK

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
foreach($random_string as $value)
{
$sql="INSERT INTO `kody`(`kod`) VALUES ('$value')";
   mysql_query($sql,$con);
}
mysql_query("COMMIT");