快速插入到array / sql

时间:2012-08-23 21:21:40

标签: php sql arrays

我收到了这段代码

$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);
}

但将它插入数据库甚至阵列需要花费很多时间。有人知道如何改进此代码吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

是的,使用一个查询通过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查询,这应该运行得更快。

答案 2 :(得分:0)

问题可能是它试图在每次插入后更新INDEX。尝试使用交易。这只会在调用COMMIT之后一次更新INDEX。如果出现问题,这也会让你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");