InnoDB
INFORMATION_SCHEMA
テーブルを使用して、InnoDB
で管理されるスキーマオブジェクトに関するメタデータを抽出できます。 この情報はデータディクショナリから取得されます。 従来、このタイプの情報は、セクション15.17「InnoDB モニター」 の手法を使用して取得し、InnoDB
モニターを設定して、SHOW ENGINE INNODB STATUS
ステートメントからの出力を解析します。 InnoDB
INFORMATION_SCHEMA
テーブルのインタフェースを使用すると、SQL を使用してこのデータをクエリーできます。
InnoDB
INFORMATION_SCHEMA
スキーマオブジェクトテーブルには、次のテーブルが含まれます。
INNODB_DATAFILES
INNODB_TABLESTATS
INNODB_FOREIGN
INNODB_COLUMNS
INNODB_INDEXES
INNODB_FIELDS
INNODB_TABLESPACES
INNODB_TABLESPACES_BRIEF
INNODB_FOREIGN_COLS
INNODB_TABLES
これらのテーブル名は、提供されるデータのタイプを示しています。
INNODB_TABLES
は、InnoDB
テーブルに関するメタデータを提供します。INNODB_COLUMNS
は、InnoDB
テーブルのカラムに関するメタデータを提供します。INNODB_INDEXES
は、InnoDB
インデックスに関するメタデータを提供します。INNODB_FIELDS
では、InnoDB
インデックスのキーカラム (フィールド) に関するメタデータが提供されます。INNODB_TABLESTATS
では、メモリー内データ構造から導出されたInnoDB
テーブルに関する低レベルのステータス情報のビューが提供されます。INNODB_DATAFILES
では、InnoDB
file-per-table および一般テーブルスペースのデータファイルパス情報が提供されます。INNODB_TABLESPACES
は、InnoDB
file-per-table、general および undo テーブルスペースに関するメタデータを提供します。INNODB_TABLESPACES_BRIEF
では、InnoDB
テーブルスペースに関するメタデータのサブセットが提供されます。INNODB_FOREIGN
は、InnoDB
テーブルに定義されている外部キーに関するメタデータを提供します。INNODB_FOREIGN_COLS
では、InnoDB
テーブルに定義されている外部キーのカラムに関するメタデータが提供されます。
InnoDB
INFORMATION_SCHEMA
スキーマオブジェクトテーブルは、TABLE_ID
、INDEX_ID
、SPACE
などのフィールドを使用して結合できるため、調査または監視するオブジェクトに使用可能なすべてのデータを簡単に取得できます。
各テーブルのカラムについては、InnoDB
INFORMATION_SCHEMA のドキュメントを参照してください。
例 15.2 InnoDB INFORMATION_SCHEMA スキーマオブジェクトテーブル
この例では、単一のインデックス (i1
) を持つ単純なテーブル (t1
) を使用して、InnoDB
INFORMATION_SCHEMA
スキーマオブジェクトテーブルにあるメタデータのタイプを示します。
-
テストデータベースとテーブル
t1
を作成します。mysql> CREATE DATABASE test; mysql> USE test; mysql> CREATE TABLE t1 ( col1 INT, col2 CHAR(10), col3 VARCHAR(10)) ENGINE = InnoDB; mysql> CREATE INDEX i1 ON t1(col1);
-
テーブル
t1
を作成した後、INNODB_TABLES
をクエリーしてtest/t1
のメタデータを検索します:mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G *************************** 1. row *************************** TABLE_ID: 71 NAME: test/t1 FLAG: 1 N_COLS: 6 SPACE: 57 ROW_FORMAT: Compact ZIP_PAGE_SIZE: 0 INSTANT_COLS: 0
テーブル
t1
のTABLE_ID
は 71 です。FLAG
フィールドは、テーブルの形式とストレージの特性に関するビットレベルの情報を提供します。 6 つのカラムがあり、そのうちの 3 つがInnoDB
によって作成された非表示のカラム (DB_ROW_ID
、DB_TRX_ID
、およびDB_ROLL_PTR
) です。 このテーブルのSPACE
の ID は 57 です (0 の値は、テーブルがシステムテーブルスペース内に存在することを示します)。ROW_FORMAT
はコンパクトです。ZIP_PAGE_SIZE
は、Compressed
行フォーマットのテーブルにのみ適用されます。INSTANT_COLS
では、ALGORITHM=INSTANT
でALTER TABLE ... ADD COLUMN
を使用して最初のインスタントカラムを追加する前に、テーブルのカラム数が表示されます。 -
INNODB_TABLES
のTABLE_ID
情報を使用して、INNODB_COLUMNS
テーブルにテーブルのカラムに関する情報をクエリーします。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS where TABLE_ID = 71\G *************************** 1. row *************************** TABLE_ID: 71 NAME: col1 POS: 0 MTYPE: 6 PRTYPE: 1027 LEN: 4 HAS_DEFAULT: 0 DEFAULT_VALUE: NULL *************************** 2. row *************************** TABLE_ID: 71 NAME: col2 POS: 1 MTYPE: 2 PRTYPE: 524542 LEN: 10 HAS_DEFAULT: 0 DEFAULT_VALUE: NULL *************************** 3. row *************************** TABLE_ID: 71 NAME: col3 POS: 2 MTYPE: 1 PRTYPE: 524303 LEN: 10 HAS_DEFAULT: 0 DEFAULT_VALUE: NULL
TABLE_ID
およびNAME
カラムに加えて、INNODB_COLUMNS
は、(0 から始まり、順次増分する) 各カラムの順序位置 (POS
)、MTYPE
または「「メインタイプ」」 (6 = INT, 2 = CHAR, 1 = VARCHAR)、PRTYPE
または「「正確な型」」 (MySQL データセット、文字セットコード、およびヌル可能性を示すビットを持つバイナリ値) およびコード長を表すリテラル (LEN
) を提供します。HAS_DEFAULT
およびDEFAULT_VALUE
のカラムは、ALGORITHM=INSTANT
とともにALTER TABLE ... ADD COLUMN
を使用して即時に追加されたカラムにのみ適用されます。 -
INNODB_TABLES
のTABLE_ID
情報を再度使用して、テーブルt1
に関連付けられたインデックスに関する情報をINNODB_INDEXES
にクエリーします。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE TABLE_ID = 71 \G *************************** 1. row *************************** INDEX_ID: 111 NAME: GEN_CLUST_INDEX TABLE_ID: 71 TYPE: 1 N_FIELDS: 0 PAGE_NO: 3 SPACE: 57 MERGE_THRESHOLD: 50 *************************** 2. row *************************** INDEX_ID: 112 NAME: i1 TABLE_ID: 71 TYPE: 0 N_FIELDS: 1 PAGE_NO: 4 SPACE: 57 MERGE_THRESHOLD: 50
INNODB_INDEXES
は、2 つのインデックスのデータを返します。 最初のインデックスはGEN_CLUST_INDEX
です。これは、テーブルにユーザー定義のクラスタ化されたインデックスが存在しない場合にInnoDB
によって作成されたクラスタ化されたインデックスです。 2 番目のインデックス (i1
) は、ユーザー定義のセカンダリインデックスです。INDEX_ID
は、インスタンス内のすべてのデータベースにわたって一意であるインデックスの識別子です。TABLE_ID
は、そのインデックスが関連付けられているテーブルを識別します。 インデックスのTYPE
値は、インデックスのタイプ (1 = クラスタ化されたインデックス、0 = セカンダリインデックス) を示します。N_FILEDS
値は、このインデックスを構成するフィールドの数です。PAGE_NO
はインデックスの B ツリーのルートページ番号であり、SPACE
はインデックスが存在するテーブルスペースの ID です。 ゼロ以外の値は、インデックスがシステムテーブルスペースに存在しないことを示します。MERGE_THRESHOLD
では、インデックスページのデータ量のパーセンテージしきい値を定義します。 行が削除されたとき、または更新操作によって行が短縮されたときに、インデックスページのデータ量がこの値 (デフォルトは 50%) を下回った場合、InnoDB
はインデックスページを隣接するインデックスページとマージしようとします。 -
INNODB_INDEXES
のINDEX_ID
情報を使用して、INNODB_FIELDS
にインデックスi1
のフィールドに関する情報をクエリーします。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FIELDS where INDEX_ID = 112 \G *************************** 1. row *************************** INDEX_ID: 112 NAME: col1 POS: 0
INNODB_FIELDS
には、インデックス付きフィールドのNAME
と、インデックス内での順序位置が用意されています。 インデックス (i1) が複数のフィールドに定義されている場合、INNODB_FIELDS
はインデックス付けされた各フィールドのメタデータを提供します。 -
INNODB_TABLES
のSPACE
情報を使用して、INNODB_TABLESPACES
テーブルにテーブルのテーブルスペースに関する情報をクエリーします。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE = 57 \G *************************** 1. row *************************** SPACE: 57 NAME: test/t1 FLAG: 16417 ROW_FORMAT: Dynamic PAGE_SIZE: 16384 ZIP_PAGE_SIZE: 0 SPACE_TYPE: Single FS_BLOCK_SIZE: 4096 FILE_SIZE: 114688 ALLOCATED_SIZE: 98304 AUTOEXTEND_SIZE: 0 SERVER_VERSION: 8.0.23 SPACE_VERSION: 1 ENCRYPTION: N STATE: normal
INNODB_TABLESPACES
では、テーブルスペースのSPACE
ID および関連付けられたテーブルのNAME
に加えて、テーブルスペースのフォーマットおよび記憶特性に関するビットレベルの情報であるテーブルスペースFLAG
データが提供されます。 テーブルスペースROW_FORMAT
、PAGE_SIZE
およびその他のいくつかのテーブルスペースメタデータ項目も用意されています。 -
INNODB_TABLES
のSPACE
情報を再度使用して、INNODB_DATAFILES
にテーブルスペースデータファイルの場所をクエリーします。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE SPACE = 57 \G *************************** 1. row *************************** SPACE: 57 PATH: ./test/t1.ibd
データファイルは、MySQL の
data
ディレクトリの下のtest
ディレクトリにあります。 file-per-table テーブルスペースがCREATE TABLE
ステートメントのDATA DIRECTORY
句を使用して MySQL データディレクトリ以外の場所に作成された場合、テーブルスペースのPATH
は完全修飾のディレクトリパスになります。 -
最後のステップとして、テーブル
t1
(TABLE_ID = 71
) に行を挿入し、INNODB_TABLESTATS
テーブルのデータを表示します。 このテーブル内のデータは、InnoDB
テーブルのクエリー時に使用するインデックスを決定するために MySQL オプティマイザによって使用されます。 この情報は、インメモリーデータ構造から取得されます。mysql> INSERT INTO t1 VALUES(5, 'abc', 'def'); Query OK, 1 row affected (0.06 sec) mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESTATS where TABLE_ID = 71 \G *************************** 1. row *************************** TABLE_ID: 71 NAME: test/t1 STATS_INITIALIZED: Initialized NUM_ROWS: 1 CLUST_INDEX_SIZE: 1 OTHER_INDEX_SIZE: 0 MODIFIED_COUNTER: 1 AUTOINC: 0 REF_COUNT: 1
STATS_INITIALIZED
フィールドは、このテーブルの統計が収集されているかどうかを示します。NUM_ROWS
は、現在の推定されるテーブル内の行数です。CLUST_INDEX_SIZE
およびOTHER_INDEX_SIZE
フィールドはそれぞれ、テーブルのクラスタ化されたインデックスとセカンダリインデックスを格納するディスク上のページの数をレポートします。MODIFIED_COUNTER
値は、外部キーからの DML 操作およびカスケード操作によって変更された行数を示します。AUTOINC
値は、自動インクリメントベースの操作に対して発行される次の番号です。 テーブルt1
では自動インクリメントカラムが定義されていないため、この値は 0 です。REF_COUNT
値はカウンタです。 このカウンタが 0 に達すると、テーブルキャッシュからテーブルメタデータを削除できることを示します。
例 15.3 外部キー INFORMATION_SCHEMA スキーマオブジェクトテーブル
INNODB_FOREIGN
テーブルおよび INNODB_FOREIGN_COLS
テーブルは、外部キー関係に関するデータを提供します。 この例では、外部キー関係を持つ親テーブルと子テーブルを使用して、INNODB_FOREIGN
テーブルと INNODB_FOREIGN_COLS
テーブルで検出されたデータを示します。
-
テストデータベースおよび親テーブルと子テーブルを作成します。
mysql> CREATE DATABASE test; mysql> USE test; mysql> CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; mysql> CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), CONSTRAINT fk1 FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB;
-
親テーブルと子テーブルが作成されたら、
INNODB_FOREIGN
をクエリーして、test/child
とtest/parent
の外部キー関係の外部キーデータを見つけます:mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN \G *************************** 1. row *************************** ID: test/fk1 FOR_NAME: test/child REF_NAME: test/parent N_COLS: 1 TYPE: 1
メタデータには、子テーブルで定義された
CONSTRAINT
として指定されている外部キーID
(fk1
) が含まれています。FOR_NAME
は、外部キーが定義されている子テーブルの名前です。REF_NAME
は、親テーブル (「参照される」テーブル) の名前です。N_COLS
は、外部キーのインデックス内のカラム数です。TYPE
は、外部キーカラムに関する追加情報を提供するビットフラグを表す数値です。 この場合、TYPE
値は 1 です。これは、外部キーに対してON DELETE CASCADE
オプションが指定されたことを示します。TYPE
値の詳細は、INNODB_FOREIGN
テーブルの定義を参照してください。 -
外部キー
ID
を使用して、INNODB_FOREIGN_COLS
をクエリーして、外部キーのカラムに関するデータを表示します。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN_COLS WHERE ID = 'test/fk1' \G *************************** 1. row *************************** ID: test/fk1 FOR_COL_NAME: parent_id REF_COL_NAME: id POS: 0
FOR_COL_NAME
は子テーブル内の外部キーカラムの名前であり、REF_COL_NAME
は親テーブル内の参照されるカラムの名前です。POS
値は、外部キーのインデックス内のキーフィールドの序数位置です (0 から始まります)。
例 15.4 InnoDB INFORMATION_SCHEMA スキーマオブジェクトテーブルの結合
この例では、employees サンプルデータベースのテーブルに関するファイル形式、行形式、ページサイズおよびインデックスサイズ情報を収集するために、3 つの InnoDB
INFORMATION_SCHEMA
スキーマオブジェクトテーブル (INNODB_TABLES
、INNODB_TABLESPACES
および INNODB_TABLESTATS
) を結合する方法を示します。
クエリー文字列を短くするために、次のテーブル名のエイリアスが使用されます。
INFORMATION_SCHEMA.INNODB_TABLES
: aINFORMATION_SCHEMA.INNODB_TABLESPACES
: bINFORMATION_SCHEMA.INNODB_TABLESTATS
: c
圧縮テーブルに対応するために、IF()
制御フロー関数が使用されています。 テーブルが圧縮されている場合、インデックスサイズは PAGE_SIZE
ではなく、ZIP_PAGE_SIZE
を使用して計算されます。 バイト単位でレポートされる CLUST_INDEX_SIZE
および OTHER_INDEX_SIZE
を 1024*1024
で割ると、M バイト (MB) 単位のインデックスサイズが得られます。 MB 値は、ROUND()
関数を使用して小数点以下 0 桁に丸められます。
mysql> SELECT a.NAME, a.ROW_FORMAT,
@page_size :=
IF(a.ROW_FORMAT='Compressed',
b.ZIP_PAGE_SIZE, b.PAGE_SIZE)
AS page_size,
ROUND((@page_size * c.CLUST_INDEX_SIZE)
/(1024*1024)) AS pk_mb,
ROUND((@page_size * c.OTHER_INDEX_SIZE)
/(1024*1024)) AS secidx_mb
FROM INFORMATION_SCHEMA.INNODB_TABLES a
INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES b on a.NAME = b.NAME
INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS c on b.NAME = c.NAME
WHERE a.NAME LIKE 'employees/%'
ORDER BY a.NAME DESC;
+------------------------+------------+-----------+-------+-----------+
| NAME | ROW_FORMAT | page_size | pk_mb | secidx_mb |
+------------------------+------------+-----------+-------+-----------+
| employees/titles | Dynamic | 16384 | 20 | 11 |
| employees/salaries | Dynamic | 16384 | 93 | 34 |
| employees/employees | Dynamic | 16384 | 15 | 0 |
| employees/dept_manager | Dynamic | 16384 | 0 | 0 |
| employees/dept_emp | Dynamic | 16384 | 12 | 10 |
| employees/departments | Dynamic | 16384 | 0 | 0 |
+------------------------+------------+-----------+-------+-----------+