2017-11-25 20 views
0

毎時1回実行するcronジョブを使用して、ローカルデータベースをAPIの時間データで更新しています。私のcronジョブ/データベースの更新を高速化するには

データベースは時間単位のデータを行に格納し、APIは過去24時間を表す24ポイントのデータを返します。

データポイントが見つからないことがあるので、データを取り戻すときに、最新の時間のみを更新することはできません。このデータを以前に保持していたかどうかを確認し、ギャップが見つかるギャップを記入する必要があります。

すべてが動作していますが、cronジョブは毎回完了するのに少なくとも30分かかっています。これをより良く/より速く/より効率的に実行する方法があるのだろうか?

// loop through the 24 data points returned 
for($i=0; $i<24; $i+=1) { 

// check if the data is for today, because the past 24 hours data will include data from yesterday 
if ($thisDate == $todaysDate) { 

// check if data for this id and this time already exists 
$query1 = "SELECT reference FROM mydatabase WHERE ((id='$id') AND (hour='$thisTime'))"; 

// if it doesnt exist, insert it 
if ($datafound==0) { 
$query2 = "INSERT INTO mydatabase (id,hour,data_01) VALUES ('$id','$thisTime','$thisData')"; 
} 

} 
} 

を1500個の異なるIDがありますので、この1500回を行います(簡潔にするために要約コード!):

私のコードは次の操作を行います!

このコードをスピードアップまたは最適化して、より高速で効率的に実行できる方法はありますか?

+0

ストアドプロシージャ内で選択と条件付き挿入を使用すると、クエリの実行が最適化されます。 – Abhishek

+0

あなたのテーブル 'mydatabase'の既存のサイズが大きいと仮定しています。 1つのアプローチは、適切な主キー(おそらく 'insert ignore'を使用)を使ってすべてをステージングテーブルにロードし、次に' mydatabase'に一度参加して更新することです。ステージングテーブル用にメモリテーブルを使用することができますが、これはさらに高速になる可能性があります。 –

答えて

1

これはあまり複雑ではなく、数秒で実行する必要があります。だから私の最初の推測では、あなたのデータベースを知らずに、あなたのデータベースにインデックスがないということです。したがって、idフィールドにインデックスがあるかどうか確認してください。 idフィールドが固有のキーでない場合は、2つのフィールドに別のインデックスを追加することを検討する必要がありますidhour。これらがまだない場合は、大量の時間を節約する必要があります。

もう1つの考え方は、単一のSQLクエリで過去24時間のすべてのデータを取得し、値を配列に格納し、そのデータのみを配列で読み取っているかどうかを確認することです。

+0

実際、idとhourカラムにインデックスがなく、これらの2つのインデックスを追加するとスピードが大幅に向上しました。ありがとう! – Richard

関連する問題