クライアントの大規模なデータベースの移動を処理しています。処理してから別のテーブルに挿入する必要がある大量のデータを取得するクエリがあります。元のクエリは、複数のテーブルを結合して必要な形式にすることを組み合わせたものです。
独自のデータベース クラスを使用して、クエリの結果全体 (主に文字列である 30 列のデータを含む約 600,000 行) を配置します。この配列は別のクラス (ArrayIterator を拡張する) に渡され、何らかの操作を行ってからターゲット データベース テーブルに挿入されます。
小さなデータセットを非常にうまく処理でき、非常に高速であることがわかっています。しかし、50 万行を超えるこのインポートでは、ますます遅くなっているようです。過去の輸入処理にかかった時間から推定残り時間を計算してみましたが、過去3時間は2時間雨が降っていたようです。
最初は 1 秒あたり 100 程度の処理でしたが、現在は 2 ~ 3 です。
これが私たちのコードの例です:
$sql = "some query";
$array = new Import($sql);
foreach($array as $data){
$db->insert('table', $data);
}
イテレータ クラスのデモ:
class Import extends ArrayIterator {
public function __construct($sql){
//database class parses query and returns all the results into an array
$array = $db->getArray($sql)
parent::__construct($array);
}
public function current() {
$data = parent::current();
//come data processing...
return $data;
}
}
徐々に減速するためのアイデアはありますか?その効率を改善するための提案はありますか?