0

130,000 行を超える mysql テーブルがあります。
私がやろうとしているのは、テーブルを「再生成」することです。bind という名前の列があり、id (インデックス) と同じにする必要があります。初期設定では、バインドは id と同じである必要があります。そのような単純な。使用したコードは以下です。PDO、クラス、関数を使用しています。

$time_start = microtime(true); 
try{
    $sql = "SELECT * FROM `table_name`";
    $STH = $this->dbConn()->query($sql);
    $STH->execute();
    while($row = $STH->fetch(PDO::FETCH_OBJ)){
        if($row->id != $row->bind){
            $query = "UPDATE `table_name` SET `bind`=? WHERE `id`=?;";
            $STH2 = $this->dbConn()->prepare($query);
            $STH2->execute(array($row->id, $row->id));
        }
    }
} catch(PDOException $e) {
    $this->errorLog($e->getMessage());
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start)/60;
echo '<br /><b>Total Execution Time:</b> '.$execution_time.' Mins';

これは私が実行するコードの一部です。$this->dbConn() は、db 接続用の基本クラスのオブジェクトです。

問題 1. 更新部分の実行に時間がかかりすぎる。ただし、更新ステートメントをエコーアウトするだけの場合、数秒かかります。

問題 2. 実行時に 500 Internal Server Error が発生します。max_execution_time 制限ではありません。スクリプトは何らかの形でバックグラウンドで実行されています。レポートを E_ALL、php.ini display_errors = On に設定しましたが、/etc/php5-frm ログ ファイルの /etc/logs/apache2 のログ ファイルにエラーが見つかりません。

解決しましたが、いくつかのエラーがあります。多分私はばかです。

while($row = $STH->fetch(PDO::FETCH_OBJ)){
            if($row->id != $row->bind){
            $query[] = "UPDATE `table_name` SET `bind`=`id`";
            }
        }
        $query = implode(';',$query).';';
        $STH2 = $this->dbConn()->exec($query) ; 

ステートメントが ';' で終了している場合、PDO はバッチ挿入を認識します。
while ループにいくつかの変更を加えて配列を作成し、配列を内破して sql ステートメントを作成しました。
それでも、スクリプトは数秒で実行されます。これは非常に優れていますが、スクリプトは終了していません。私のコードに何か欠陥がありますか? コードは正常に実行され、データベースは更新され、すべて 130000 行以上ありますが、スクリプトによって 5 分後に 500 内部サーバー エラーが発生します。

4

1 に答える 1

1
UPDATE `table_name` SET `bind`=`id`
于 2013-08-11T10:34:39.000 に答える