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) { ... }配列を使用してください。

Web ホストのアクセス許可に応じて、別の重要な最適化として、160 万のクエリを生成する代わりに、fputcsv()アレイをディスクに書き込み、MySQL を使用してコンテンツをデータベースにロードすることができます。LOAD DATA INFILE

于 2012-08-23T21:28:04.850 に答える
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クエリを生成できます。これにより、はるかに高速に実行されるはずです。

于 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 に答える