0

我得到了这个代码

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

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

4

3 回答 3

2

嗯,in_array()比较贵。使用散列代替简单数组,然后您可以使用isset()代替in_array().

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

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

于 2012-08-23T21:28:04.850 回答
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 查询,这应该运行得更快。

于 2012-08-23T21:24:32.153 回答
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");
于 2012-08-23T21:23:52.023 回答