InnoDB
トランザクション処理を最適化するには,トランザクション機能のパフォーマンスオーバーヘッドとサーバーのワークロードの理想的なバランスを見つけます。たとえば,アプリケーションで,秒あたり数千回コミットする場合にパフォーマンスの問題が発生し,2、3時間に1回だけコミットする場合に別のパフォーマンスの問題が発生することがあります。
デフォルトのMySQL設定
自动提交= 1
は,ビジなデ。現実的であれば,设置自动提交= 0
または开始事务
ステトメントを発行し,すべての変更を行なったあとに,提交
ステトメントを発行することで,複数の関連DML操作を単一のトランザクションにまとめます。InnoDB
は,トランザクションによってデータベースが変更された場合,そのトランザクションのコミットのたびにディスクにログをフラッシュする必要があります。変更のたびにあとでコミットされる場合(デフォルトの自動コミット設定のように),ストレージデバイスのI / Oスループットによって,秒あたりに可能な操作数が制限されます。または,単一の
选择
ステトメントのみから構成されるトランザクションの場合,自动提交
をオンにすると,InnoDB
が読み取り専用トランザクションを認識し,それらを最適化するのに役立ます。要件にいては,セクション14.13.14 " InnoDBの読み取り専用トランザクションの最適化"を参照してください。大量の行の挿入,更新,または削除後のロ,ルバックの実行は避けます。大きなトランザクションによってサーバーのパフォーマンスが低下する場合,それをロールバックすると,問題が悪化し,元のDML操作の数倍の実行時間がかかる可能性があります。ロールバックはサーバーの起動時に再度開始されるため,データベースプロセスを強制終了しても役立ちません。
この問題の発生の可能性を最小にするには:すべてのDMLの変更をただちにディスクに書き込むのではなく,キャッシュできるように,バッファプルのサ邮箱ズを増やします。挿入に加えて,更新および削除操作がバッファリングされるように,
innodb_change_buffering =所有
を設定します。大きなDML操作中に,提交
ステートメントを定期的に発行し,可能であれば単一の削除または更新を少数の行に対して操作する複数のステートメントに分割することを考慮します。ロールバックの暴走が発生した場合にそれを解消するには,ロールバックがCPUに依存して高速に実行するように,バッファープールを増加するか,セクション14.16.1 " InnoDBのリカバリプロセス"に説明するように,サ,バ,を強制終了し,
innodb_force_recovery = 3
で再起動します。この問題はMySQL 5.5以上またはInnoDBプラグイン付きのMySQL 5.1では,あまり目立たなくなっていると予想されます。デフォルトの設定
innodb_change_buffering =所有
により,更新および削除操作がメモリー内にキャッシュされ,それらがそもそも高速に実行されるようになり,必要な場合にロールバックも高速になったためです。多くの挿入,更新,または削除を伴う長時間実行トランザクションを処理するサーバーでこのパラメータ設定を使うようにしてください。クラッシュが発生した場合に,最新のコミットされたトランザクションの一部の損失を許容できる場合は,
innodb_flush_log_at_trx_commit
パラメタを0に設定できます。フラッシュが保証されていなくても,InnoDB
はとにかく1秒に1回ログをフラッシュしようとします。さらに,innodb_support_xa
の値を0に設定し,これにより,ディスク上データとバイナリログの同期によるディスクフラッシュの数を減らします。行が変更されるか削除される場合,行と関連付けられた撤销ログはただに,またはトランザクションのコミットの直後でも,物理的に削除されません。以前または同時に開始したトランザクションが終了するまで古いデータは保持されるため,それらのトランザクションは変更または削除された行の以前の状態にアクセスできます。そのため,長時間実行トランザクションは,
InnoDB
が別のトランザクションによって変更されたデタをパジすることを妨げることがあります。長時間実行トランザクション内で行が変更されるか,削除された場合,
读过承诺
および可重复读取
分離レベルを使用するほかのトランザクションは,古いデータを再構築するために,それらの同じ行を読み取る場合,多くの作業を実行する必要があります。長時間実行トランザクションでテーブルが変更された場合,ほかのトランザクションからのそのテーブルに対するクエリーは,カバリング邮箱ンデックス技法を利用しません。通常,セカンダリインデックスからすべての結果カラムを取得できるクエリーは,代わりにテーブルデータから該当する値をルックアップします。
セカンダリンデックスペジに,新しすぎる
PAGE_MAX_TRX_ID
があることが検出された場合,またはセカンダリ邮箱ンデックス内のレコ,ドに削除がマ,InnoDB
はクラスタ化された邮箱ンデックスを使用してレコ邮箱ドをルックアップする必要がある可能性があります。