我收到了这段代码
$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);
}
但将它插入数据库甚至阵列需要花费很多时间。有人知道如何改进此代码吗?
答案 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");