我得到了这个代码
$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");