2012-03-01 9 views
0

APIからデータを取得するPHPから100,000 + MySQLデータベースを更新する必要があります。私はその時に5,000以上をやろうとすると失敗します。100,000レコードのMySQLデータベースを効率的に更新する方法

私は、制限が0,5,000である更新クエリを使用して5,000を実行し、これらのレコードが更新された時刻にタイムスタンプを付けることで、5,000を行うのが最善の方法だと考えています。次に、最後に更新された時刻が現在の時刻から20分を超えた次の5,000を選択します。

誰でもこのクエリを構成する方法についての助けを提供できますか?あるいは、このアプローチは最適ではありませんか?

+5

はどのように "失敗しますか"?クエリは何ですか? –

+2

タイムアウトに失敗した場合は、http://php.net/manual/en/function.set-time-limit.phpを試すことができます。 – bumperbox

+0

タイムスタンプをばかにするのではなく、追加の列を追加するだけです一時的に。しかし、まず、あなたが得ているエラーは何ですか? –

答えて

0

は、一時テーブルを作成し、複数の更新データを挿入し、

UPDATE `table`, `tmp` 
    SET `table`.`column` = `tmp`.`column` 
    WHERE `table`.`id` = `tmp`.`id`; 
+1

私はそれがMySQLの問題だと思っています。私が打つAPiは失敗していて、一度に5,000以上を処理できません。そこで私は、100,000レコードを5,000バッチでバッチし、その日の一定の間隔でバッチ処理することを探していました。ありがとうジョナサン –

1

だから、これは正しくまたは誤ってそれが動作しますが、私が行っているソリューションです。だから、問題を要約すると、私は100kの行を持っています。これらをループし、jsonフィードを返すAPIにユーザIDを渡す必要があります。

返されたデータを使用して各レコードを更新します。何らかの理由で、これはAPIに起因すると思われるタイムアウトまたはサーバー500エラーのために失敗します。だから、すべての100kのreordを選択するのではなく、5k(limit 0、5000)を選択し、 'updated'という列を追加して、それが更新されるとtrueとマークします。

すべてのレコードが更新されるまで、これを続けます。これが起こると、私は更新された列をfalseに設定し、プロセスを再び開始します。このスクリプトは30分ごとにchronジョブで実行され、正常に動作するようです。なぜ私はそれが最初にタイムアウトしていたのかを知ることができたと思うが、私はそれがアクセスできないPHPの問題(タイムアウト設定)になる可能性があると思う。

おかげ

ジョナサン

関連する問題