2009-04-02 11 views
3

6k +結果を簡単に返すことができるAPIメソッドを呼び出すPHPスクリプトがあります。INSERT 6000行 - ベストプラクティス

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

上記のスクリプトは一度に20人のユーザーをバッチ処理していますが、一部のAPIではいくつかの結果しか得られませんが、最悪のケースは、すべてが1000の結果を持っているということです。

APIを呼び出すループは正常ですが、5分ごとに20のバッチが正常に機能します。私の唯一の懸念事項は、各ユーザーのための1000個のmysql INSERTです(フレッシュなAPI呼び出しのために各ユーザーの間に長いポーズがあります)

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

+0

私は[1] それは私が考えて同じ問題を解決し、[この投稿は役立つかもしれません]が見つかり [1]:http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple -rows-in-single-query –

答えて

1

あなたの処理方法は、処理できる負荷よりも多くなりますか?それが機能している場合、私はそれをオフハンドに変更する理由は見当たりません。

4

まあ、それはこのように、値の多くで1つのinsert文を行うことであろう行うには最速の方法:

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

しかし、それはおそらくあなたが今使用しているDB_DataObjectの方法を捨てる必要となります。 DB_DataObjectを使用することによる「使いやすさ」の利点と比較して、パフォーマンスのメリットを評価するだけで済みます。

2

Kaliumのように、ボトルネックがどこにあるかを確認します。 実際にデータベースの場合、DBMSが提供する一括インポート機能を試すことができます。

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

0

通常、データベースの抽象化レイヤーはかなりのオーバーヘッドを追加します。 PHPのatleastでは、あなたの選択したライブラリを最適化するよりも、スピードのためにプレーンなmysql_queryを使うほうがはるかに簡単です。

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

0

私にはいくつかのアイデアがありますが、テストで確認する必要があります。

挿入するテーブルにインデックスがある場合は、挿入用に最適化されているかどうかを確認してください。

ここでの最適化オプションをチェックアウト: http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

は直接mysqliの、またはPEAR :: MDB2またはPDO考えてみましょう。 Pear :: DBはかなり遅いと私は理解していますが、私はPEARを自分で使用していないので、検証できません。

0

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

MySQLドキュメントのSpeed of INSERT statementsの章を参照してください。

これは、MySQLでINSERTINGを改善する方法についてたくさん話しています。

0

私は数千のレコードがあなたのデータベースに負担をかけるべきではないと思います。私のラップトップでもうまく処理する必要があります。あなたの最大の関心事あなたがクリーンアップやパーティショニングをしない場合、巨大なテーブルになることがあります。その部分の早すぎる最適化を避けてください。

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

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

テーブルのインデックスが正しく作成されていることを確認してください(未使用のテーブルを削除するなど)。インデックスは挿入速度を傷つける。

定期的に/ vacuumを最適化することを忘れないでください。