MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  InnoDB の読み取り専用トランザクションの最適化

8.5.3 InnoDB の読み取り専用トランザクションの最適化

InnoDB では、読取り専用として認識されているトランザクションの transaction ID (TRX_ID フィールド) の設定に関連するオーバーヘッドを回避できます。 トランザクション ID は、書き込み操作またはロック読み取り (SELECT ... FOR UPDATE など) を実行する可能性のあるトランザクションにのみ必要です。 不要なトランザクション ID を排除すると、クエリーまたはデータ変更ステートメントが read view を構成するたびに参照される内部データ構造のサイズが削減されます。

InnoDB は、次の場合に読取り専用トランザクションを検出します:

  • トランザクションが START TRANSACTION READ ONLY ステートメントで開始された場合。 この場合は、データベース (InnoDBMyISAM、またはその他のタイプのテーブル) に対して変更を行おうとするとエラーが発生し、そのトランザクションは読み取り専用状態のままになります。

    ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.

    ただし、読み取り専用トランザクションでのセッション固有の一時テーブルの変更や、それらのテーブルに対するロッククエリーの発行は、その変更やロックがほかのどのトランザクションにも表示されないため引き続き可能です。

  • autocommit 設定がオンになっているため、トランザクションが 1 つのステートメントであることが保証され、そのトランザクションを構成している 1 つのステートメントが非ロックSELECT ステートメントである場合。 つまり、FOR UPDATE または LOCK IN SHARED MODE 句を使用しない SELECT です。

  • トランザクションは READ ONLY オプションなしで開始されますが、行を明示的にロックする更新またはステートメントはまだ実行されていません。 更新または明示的ロックが必要になるまで、トランザクションは読取り専用モードのままです。

したがって、レポートジェネレータなどの読取り集中型アプリケーションの場合は、START TRANSACTION READ ONLY および COMMIT 内でグループ化するか、SELECT ステートメントを実行する前に autocommit 設定をオンにするか、単にクエリーと混在するデータ変更ステートメントを回避することで、一連の InnoDB クエリーをチューニングできます。

START TRANSACTION および autocommit については、セクション13.3.1「START TRANSACTION、COMMIT および ROLLBACK ステートメント」を参照してください。

注記

自動コミット、非ロック、および読み取り専用 (AC-NL-RO) として承認されたトランザクションは、InnoDB の特定の内部データ構造から除外されるため、SHOW ENGINE INNODB STATUS の出力には表示されません。


関連キーワード:  InnoDB, テーブル, トランザクション, ステートメント, インデックス, ロック, クエリー, 専用, 結合, 状態