3

6k 以上の結果を簡単に返すことができる API メソッドを呼び出す PHP スクリプトがあります。

PEAR DB_DataObject を使用して、foreach ループ内の各行を DB に書き込みます。

上記のスクリプトは、一度に 20 人のユーザーをバッチ処理しています。API からの結果が少ないものもあれば、それ以上のものもあります。最悪の場合、すべてが数千の結果を持っていることです。

API を呼び出すループは問題ないようです。5 分ごとに 20 個のバッチが正常に動作します。私の唯一の懸念は、各ユーザーの数千の mysql INSERT です (新しい API 呼び出しのために各ユーザー間で長い一時停止があります)。

これを行う良い方法はありますか?それとも私はそれを良い方法でやっていますか?

4

7 に答える 7

4

それを行う最も速い方法は、次のように、多くの値を指定して 1 つの挿入ステートメントを実行することです。

INSERT INTO mytable (col1, col2) VALUES ( (?,?), (?,?), (?,?), ...)

しかし、それにはおそらく、現在使用している DB_DataObject メソッドを捨てる必要があります。DB_DataObject を使用することによる「使いやすさ」のメリットと、その方法によるパフォーマンスのメリットを比較検討する必要があります。

于 2009-04-02T17:40:25.073 に答える
2

カリウムが言ったように、ボトルネックがどこにあるかを確認してください。それが本当にデータベースである場合は、一部の DBMS が提供する一括インポート機能を試すことができます。

たとえば、DB2 では LOAD と呼ばれます。SQL なしで動作しますが、名前付きパイプから直接読み取ります。多数の新しい行をデータベースに取り込む必要がある場合に高速になるように特に設計されています。チェックとインデックス作成をスキップするように構成できるため、さらに高速になります。

于 2009-04-02T17:53:41.393 に答える
1

さて、あなたの方法はあなたが処理できる以上の負荷を生み出していますか? それが機能している場合は、手に負えないように変更する理由はありません。

于 2009-04-02T17:36:07.863 に答える
0

数千のレコードがデータベースに負担をかけることはないと思います。私のラップトップでさえそれをうまく処理するはずです。クリーンアップやパーティショニングを行わない場合、最大の懸念は巨大なテーブルになる可能性があります。その部分の時期尚早な最適化を避けてください。

メソッドについては、各ユーザー(またはバッチ)を個別のトランザクションで実行するようにしてください。mysqlの場合は、不要なロックを回避するためにinnodbを使用していることを確認してください。トランザクションをサポートするinnodb/postgres / otherデータベースをすでに使用している場合は、パフォーマンスが大幅に向上する可能性があります。

COPYの使用を検討してください(少なくともpostgresでは-mysqlについては不明です)。

テーブルに適切なインデックスが付けられていることを確認します(未使用のテーブルの削除を含む)。インデックスは挿入速度を低下させます。

定期的に最適化/掃除機をかけることを忘れないでください。

于 2009-04-02T20:15:53.733 に答える
0

MySQL LOAD DATA INFILE機能は、おそらくあなたが望むことを行うための最速の方法です。

MySQLドキュメントのINSERTステートメントの速度の章をご覧ください。

MySQL で INSERTING を改善するための多くの方法について説明しています。

于 2009-04-02T19:41:42.957 に答える
0

データベース抽象化レイヤーは、通常、かなりの量のオーバーヘッドを追加します。少なくとも PHP では、選択したライブラリを最適化するよりも、速度のために単純な mysql_query を使用する方がはるかに簡単であることがわかりました。

Eric P と weinzierl.name が言ったように、複数行の挿入または LOAD を使用すると、最高の直接的なパフォーマンスが得られます。

于 2009-04-02T17:55:38.970 に答える