Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


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

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

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

現在、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 です。

そのため、レポートジェネレータなどの読み取りの多いアプリケーションの場合は、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 の出力には表示されません。これらのトランザクションは、情報スキーマでのみ表示されます。