2011-06-30 19 views
2

StackOverflowはこれまでに多くの質問に答えましたが、私は正確な答えを見つけることができなかったより具体的なものを探しています。PHP/MySQLとDoctrineの複数の挿入に関するベストプラクティス

私は現在Doctrine 1.2.2でPHP/MySQLを使用していますが、私のスクリプトを改善することを楽しみにしています。実際には、データベースに5分ごとに約300のエントリが追加されます。実際には、このスクリプトはdoctrineではなく、mysql multi-insertを使用しています。

私は、より良い、より速く、より少ないリソースを使用しているのだろうかと思っていました。 ありがとうございます。

最初の編集とテスト

OK、みんな、最初のものを初:)

私は唯一のMySQLステートメントを使用して最初に試してみました。 FabrizioはINSERT DELAYEDの使用を提案しましたが、私はinnoDBを使用しているので利用できません。

私は、実行する必要のある各ジョブを3回実行するMySQLステートメントを使用していくつかのテストを実現しました。最初のジョブでは、実行に平均53秒かかる6.25Mbを使用しました(ここでは138ページをロードすることを覚えておいてください)

2番目のジョブでは、4.25Mbを使用して平均3分30秒私は4.75メガビットを使用して、3分9秒の平均を受信した第3ジョブの場合)ここで

を510ページをロードしている(私はここでは410ページをロードすることを覚えておいてください)

私は変換することができた最初の仕事Doctrineを実行して、同じ時間(53秒)実行しますが、9.75 Mbを使用します。 DoctrineはDUPLICATE KEYをサポートしておらず、replace()を使うとForeign Keyのために以前に追加されたデータが失われ、replace()は実際には古い値を削除して新しい値を追加するので、 。

このテストでは、私はまだMySQLのクエリの複数の挿入を使用します。どのモードのアイデアをテストする?あなたのすべて:)

+0

詳細を教えてください。なぜ300のエントリを挿入していますか?どのようなタイプのデータですか? –

+0

複数のWebサイトからコンテンツを読み込んでテーブルを更新します。整数、浮動小数点および文字列フィールドがあります。 – guiligan

答えて

0

あなたは自分でチェックしてみませんか?

SQL実行前後の単純なtime()比較で両方のソリューションのベンチマークを試してみてください。 どちらが優れているかを知るには良い方法はありません。クエリ、データベース構造、およびジョイン数に依存します(少なくともこれらの要素は多分そうではありません)。

メモリの使用については、memory_get_usageを試すことができます。

+0

私はいくつかの小切手をします!私はより多くの情報を持ってすぐに、私はここに投稿します:) – guiligan

+0

してください。私も一部の人が好奇心が強いと確信しています – Itako

+0

Itako、私はmuの投稿を更新しました。それを確認してください:) – guiligan

0

おかげでこれを行うための最善の方法は、MySQLのバッチ処理を使用しています。

1)すべての挿入を1行に入れて長いmysql文字列を作成します。詳細はこちらinsert multiple rows via a php array into mysql

2)準備済みの文を使用して準備済みの挿入文を作成し、異なる文で同じ文を実行します。 http://php.net/manual/en/mysqli.prepare.php

+0

doctrineはプリペアドステートメントを常に使用します(別途指定がない場合)。オブジェクトをループに保存するだけでOKです。 – Itako

+0

DoctrineやPropelは、挿入(メモリリーク、インテグリティチェックなど)のような大量の操作では恐ろしいことです。常に使用するエンジンに最適化されたクエリを好む(mysql ...) –

0

セルフベンチマークは最終的な解決策ですが、PHPとMySQLの間のトラフィックが多いほど、クエリの実行に費やす時間が長くなることに注意してください。表が大きく、頻繁に照会されていない場合

は、私は多分あなたは挿入する前に、テーブルをロックすると、後に、それをアンロック、

INSERT DELAYED INTO `myTable` (field1, field2) VALUES ('val1','val2),('val11','val22') 

の行に拡張された挿入、何かを示唆しています。

bulk_insert_buffer_sizeも見てみたいですが、値が小さすぎると挿入が遅くなることがあります。

もう一度、このセルフテストを行う必要があります。

+0

は、テストを実現する際にこれを考慮に入れます!ありがとう:) – guiligan

関連する問題