MySQL 5.6.4 の時点では、InnoDB
は、読み取り専用であることがわかっているトランザクションのトランザクション ID (TRX_ID
フィールド) の設定に関連したオーバーヘッドを回避できます。トランザクション ID は、書き込み操作またはロック読み取り (SELECT ... FOR UPDATE
など) を実行する可能性のあるトランザクションにのみ必要です。不必要なトランザクション ID を削除すると、クエリーや DML ステートメントによって読み取りビューが構築されるたびに参照される内部データ構造のサイズが削減されます。
現在、InnoDB
は、次の場合に読み取り専用トランザクションを検出します。
-
トランザクションが
START TRANSACTION READ ONLY
ステートメントで開始された場合。この場合は、データベース (InnoDB
、MyISAM
、またはその他のタイプのテーブル) に対して変更を行おうとするとエラーが発生し、そのトランザクションは読み取り専用状態のままになります。ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
ただし、読み取り専用トランザクションでのセッション固有の一時テーブルの変更や、それらのテーブルに対するロッククエリーの発行は、その変更やロックがほかのどのトランザクションにも表示されないため引き続き可能です。
autocommit 設定がオンになっているため、トランザクションが 1 つのステートメントであることが保証され、そのトランザクションを構成している 1 つのステートメントが「非ロック」の
SELECT
ステートメントである場合。つまり、FOR UPDATE
またはLOCK IN SHARED MODE
句を使用しないSELECT
です。
そのため、レポートジェネレータなどの読み取りの多いアプリケーションの場合は、InnoDB
のクエリーを START TRANSACTION READ ONLY
および COMMIT
の内部にグループ化するか、SELECT
ステートメントを実行する前に autocommit
設定をオンにするか、または単純にどの DML ステートメントにもクエリーが組み込まれないようにすることにより、それらのクエリーのシーケンスをチューニングできます。
START TRANSACTION
および autocommit
については、セクション13.3.1「START TRANSACTION、COMMIT、および ROLLBACK 構文」を参照してください。
自動コミット、非ロック、および読み取り専用 (AC-NL-RO) として承認されたトランザクションは、InnoDB
の特定の内部データ構造から除外されるため、SHOW ENGINE INNODB STATUS
の出力には表示されません。これらのトランザクションは、情報スキーマでのみ表示されます。