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 内部サーバー エラーが発生します。