トランザクションおよびロックテーブル (INNODB_TRX
、INNODB_LOCKS
、および INNODB_LOCK_WAITS
) によって公開されるデータは、すばやく変更されるデータへの参照を表します。これは、アプリケーションで開始された更新が発生した場合にのみデータが変更されるほかの (ユーザー) テーブルとは異なります。ベースとなるデータはシステムで管理される内部データであり、非常にすばやく変更されることがあります。
パフォーマンス上の理由から、また InnoDB
トランザクションとロック中の INFORMATION_SCHEMA
テーブルの間の JOIN
が誤って解釈される可能性を最小限に抑えるために、いずれかのテーブルに対して SELECT
が発行されると常に、InnoDB
は必要なトランザクションおよびロック情報を中間バッファーに収集します。このバッファーは、最後に読み取られてから 0.1 秒を超える時間が経過した場合にのみリフレッシュされます。3 つのテーブルを満たすために必要なデータは原子的に、かつ整合性を保ってフェッチされ、このグローバルな内部バッファー内に保存されて、ポイントインタイム「スナップショット」を形成します。複数のテーブルアクセスが 0.1 秒以内に発生した場合は (MySQL がこれらのテーブル間の結合を処理する場合は、ほぼ間違いなく発生します)、クエリーを満たすために同じスナップショットが使用されます。
これらのいずれかのテーブルを 1 つのクエリーにまとめる JOIN
を実行した場合は、3 つのテーブルのデータが同じスナップショットから取得されるため、正しい結果が返されます。バッファーはこれらのテーブルのクエリーごとにはリフレッシュされないため、これらのテーブルに対して 10 分の 1 秒以内に個別のクエリーを発行した場合は、クエリーごとの結果が同じになります。これに対して、10 分の 1 秒を超える時間離れて発行された同じテーブルまたは異なるテーブルの 2 つの個別のクエリーでは、データが異なるスナップショットから取得されるため、異なる結果が表示される可能性があります。
トランザクションおよびロックデータが収集されている間 InnoDB
は一時的に停止する必要があるため、これらのテーブルのクエリーを頻繁に実行しすぎると、ほかのユーザーから見たパフォーマンスに悪影響を与える場合があります。
これらのテーブルには機密情報 (少なくとも INNODB_LOCKS.LOCK_DATA
および INNODB_TRX.TRX_QUERY
) が含まれているため、セキュリティー上の理由から、そこからの SELECT
を許可されるのは PROCESS
権限を持つユーザーだけです。
セクション14.14.2.3「InnoDB トランザクションおよびロックテーブルのデータ永続性および一貫性」で説明されているように、InnoDB
トランザクションおよびロックテーブル (INNODB_TRX
、INNODB_LOCKS
、および INNODB_LOCK_WAITS
) を満たすデータは自動的にフェッチされ、「ポイントインタイム」スナップショットを提供する中間バッファーに保存されます。同じスナップショットからクエリーされた場合、データは 3 つのすべてのテーブルにわたって整合性があります。ただし、ベースとなるデータが非常にすばやく変更されるため、同様にすばやく変更されるほかのデータへの同様の参照が同期していない可能性があります。そのため、InnoDB
トランザクションおよびロックテーブル内のデータを PROCESSLIST
テーブル内のデータと比較する場合は注意してください。PROCESSLIST
テーブルからのデータは、ロックおよびトランザクションに関するデータと同じスナップショットからは取得されません。1 つの SELECT
(たとえば、INNODB_TRX
と PROCESSLIST
の結合) を発行した場合でも、一般に、これらのテーブルの内容には整合性がありません。INNODB_TRX
が PROCESSLIST
内には存在しない行を参照したり、INNODB_TRX.TRX_QUERY
に示されている、トランザクションの現在実行中の SQL クエリーが PROCESSLIST.INFO
内のものとは異なっていたりする可能性があります。