PDO / PHP / MySQLのパフォーマンス:トランザクションと直接実行
-
06-07-2019 - |
質問
多数の値(たとえば1〜100)をループ処理し、ループ内で準備済みステートメントを実行しています。
ループ内で直接実行する場合と比較して、ループを終了した後にコミットするトランザクションを使用する利点はありますか?
値は相互に依存しないため、その観点からはトランザクションは不要です。
解決
クエリがINSERTの場合、ページ 7.2.19 。 MySQLマニュアルのINSERTステートメントの速度は、トランザクションエンジンを使用しているかどうかに応じて、2つの興味深い情報を提供します。
非トランザクションエンジンを使用する場合:
次のINSERT操作を高速化するには 複数のステートメントで実行 非トランザクションテーブル、ロック テーブル。
これによりパフォーマンスが向上します インデックスバッファはディスクのみにフラッシュされます 一度、すべてのINSERTステートメントが 完了しました。通常、次のようになります 多くのインデックスバッファがフラッシュします INSERTステートメント。明示的なロック 可能な場合、ステートメントは必要ありません。 単一のINSERTですべての行を挿入します。
そして、トランザクションエンジンの場合:
の高速挿入を取得するには トランザクションテーブル、使用する必要があります 代わりにトランザクションを開始してコミットしてください LOCK TABLESの。
だから、トランザクションを使用するのは良い考えかもしれませんが、それはサーバーの負荷と、同じテーブルを同時に使用している複数の用途があるかどうかなどに依存する可能性があると思います...
リンク先のページには詳細情報がありますので、お気軽に読んでください;-)
また、更新ステートメントを実行している場合:
高速アップデートを取得する別の方法は 更新を遅らせてから、多くの更新を行う 後で続けて。複数の実行 一緒に更新するよりもはるかに高速です あなたがロックした場合、一度に1つを行う テーブル。
だから、挿入よりも同じことが言えると思います。
ところで:確かに、あなたは両方のソリューションを試して、 microtime
でベンチマークを行うことができます。 PHP側では、たとえば;-)
他のヒント
より速い時間のために、1回の挿入ですべての挿入を実行するか、1回の挿入が失敗したかのように一度に5または10個のグループにまとめることができます。
http://www.desilva.biz/mysql/insert.html
トランザクションは速度を低下させるため、必要ない場合は使用しないでください。
毎回クエリを作成し続ける必要がないため、バッチ挿入を行ったとしても、準備されたステートメントは良い選択です。
CSVファイル(おそらく非常に長い)データインポートを実装しなければならなかったときに同じ質問に直面しました( LOAD DATA INFILE 構文ですが、挿入する前にフィールドに処理を適用する必要がありました。
だから、トランザクションと約15,000行のファイルで実験を行いました。その結果、1つの一意のトランザクション内にすべてのレコードを挿入すると、数秒でCPUがバインドされます。トランザクションをまったく使用しない場合、数分かかり、IOが制限されます。 N行ごとにコミットすることで、中間結果が得られました。