2009-09-12 9 views
5

私はいくつかの値(例えば1〜100)をループし、ループ内でプリペアドステートメントを実行しています。PDO/PHP/MySQLでのパフォーマンス:トランザクション対直接実行

ループを終了した後にコミットするトランザクションを使用する利点と利点は、ループ内の直接実行と比較してですか?

値は互いに依存しないため、トランザクションはその観点からは必要ありません。

答えて

4

あなたのクエリが挿入がある場合は、MySQLのマニュアルのページ7.2.19. Speed of INSERT Statementsは、あなたがtransactionnalエンジンかどうかを使用しているかどうかに応じて、2、興味深い情報を提供します:

非transactionnalエンジン使用:

非トランザクションテーブルの複数のステートメントで実行される のINSERT操作を高速化するには、 テーブルをロックします。

インデックスバッファがすべて のディスクにフラッシュされるのは、すべてのINSERTステートメントが完了した後で、 が完了したためです。通常、 INSERTステートメントのように、 に多数のインデックスバッファフラッシュがあります。 単一のINSERTですべての行を挿入できる場合は、明示的ロック ステートメントは必要ありません。

そして、transactionnalエンジン付き:

トランザクションテーブルのためのより高速な挿入を取得するには、 のSTART TRANSACTIONを使用して、代わりにロックテーブル をコミットする必要があります。

私はトランザクションを使用して推測しているのは良い考えかもしれませんが、あなたのサーバーの負荷や、同時に同じテーブルを使用する複数の使用方法があるかどうか、あなたがupdate statementsを行っている場合...

があり、私がリンク先のページの詳細情報があるので、それは


;-)を読むことを躊躇しないと:

速い更新を得る別の方法は、 の更新を遅らせ、多くの更新をあとで行に入れます。 テーブルをロックすると、 の複数の更新を同時に実行すると、一度に1つずつ処理するよりもはるかに高速になります( )。

だから、私は同じことが挿入物よりも言えると思います。


ところで:確かに、あなたは、例えば、PHP側で、microtimeとそれらをベンチマーク、両方のソリューションを試すことができます;-)

+0

情報をいただき、ありがとうございます。ベンチマークを試してみる必要があります。 – jeroen

+2

私はそう思っています^^結果について知りましょう;-)それは他の人に興味があるかもしれません!そして、btw:もう1つの解決策は、複数の挿入を同時に行うために1つの挿入クエリを使用することで、クエリの総数を減らすことです - コード化するのが少し難しくなりますが、あるサーバーから別のサーバーへの呼び出し。 –

+0

はい、クエリーの数を減らすのが最善の解決策になりますが、ジェームズ・ブラックにも言及したように、私は重複したキー更新を挿入して試したことはありません。 – jeroen

3

あなたが一発ですべての挿入を行うことができ時間短縮のために1つの挿入がバッチ全体に失敗するかのように、一度に5または10個をグループ化することができます。あなたは、それはそれを使用していない必要がありませんので、もし

http://www.desilva.biz/mysql/insert.html

トランザクションは、あなたが遅くなります。

バッチインサートを実行しても、毎回クエリを作成し続ける必要がないため、準備された文が適しています。

+0

私はそれらを組み合わせることを考えていましたが、INSERT ON DUPLICATE KEY UPDATEでそれを試みたことはありません。 – jeroen

3

私はCSVファイル(かなり長い)のデータインポートを実装しなければならないときに同じ質問に直面しました(これにはLOAD DATA INFILE構文を使用できますが、挿入する前にフィールドに処理を適用しなければならなかった)。

私は約15k行のトランザクションとファイルを使って実験を行いました。その結果、1つの一意のトランザクション内にすべてのレコードを挿入すると、ほんの数秒でCPUに束縛されます。トランザクションをまったく使用しないと、数分かかりIO制限になります。 N行ごとにコミットすることで、中間結果が得られます。

+0

LOAD DATA INFILEでさらに高速になります;) – NickT

関連する問題