MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む
このページは機械翻訳したものです。
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 fk1FOREIGN 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: a
INFORMATION_SCHEMA.INNODB_TABLESPACES: b
INFORMATION_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_mbFROM INFORMATION_SCHEMA.INNODB_TABLES aINNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES b on a.NAME = b.NAMEINNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS c on b.NAME = c.NAMEWHERE 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 | +------------------------+------------+-----------+-------+-----------+