このページは機械翻訳したものです。
データベースを監視するアプリケーションでは、INFORMATION_SCHEMA
テーブルを頻繁に使用できます。 これらのテーブルに対するクエリーを最も効率的に記述するには、次の一般的なガイドラインを使用します:
データディクショナリテーブルのビューである
INFORMATION_SCHEMA
テーブルのみのクエリーを試行します。静的メタデータのみのクエリーを試行してください。 動的メタデータのカラムを選択するか、取得条件を静的メタデータとともに使用すると、動的メタデータを処理するためのオーバーヘッドが増加します。
INFORMATION_SCHEMA
クエリーでのデータベース名とテーブル名の比較動作は、予想とは異なる場合があります。 詳細は、セクション10.8.7「INFORMATION_SCHEMA 検索での照合の使用」を参照してください。
これらの INFORMATION_SCHEMA
テーブルはデータディクショナリテーブルのビューとして実装されるため、これらのテーブルに対するクエリーではデータディクショナリから情報が取得されます:
Press CTRL+C to copyCHARACTER_SETS CHECK_CONSTRAINTS COLLATIONS COLLATION_CHARACTER_SET_APPLICABILITY COLUMNS EVENTS FILES INNODB_COLUMNS INNODB_DATAFILES INNODB_FIELDS INNODB_FOREIGN INNODB_FOREIGN_COLS INNODB_INDEXES INNODB_TABLES INNODB_TABLESPACES INNODB_TABLESPACES_BRIEF INNODB_TABLESTATS KEY_COLUMN_USAGE PARAMETERS PARTITIONS REFERENTIAL_CONSTRAINTS RESOURCE_GROUPS ROUTINES SCHEMATA STATISTICS TABLES TABLE_CONSTRAINTS TRIGGERS VIEWS VIEW_ROUTINE_USAGE VIEW_TABLE_USAGE
一部のタイプの値は、非ビューの INFORMATION_SCHEMA
テーブルの場合でも、データディクショナリからの参照によって取得されます。 これには、データベース名、テーブル名、テーブルタイプ、ストレージエンジンなどの値が含まれます。
一部の INFORMATION_SCHEMA
テーブルには、テーブル統計を提供するカラムが含まれています:
Press CTRL+C to copySTATISTICS.CARDINALITY TABLES.AUTO_INCREMENT TABLES.AVG_ROW_LENGTH TABLES.CHECKSUM TABLES.CHECK_TIME TABLES.CREATE_TIME TABLES.DATA_FREE TABLES.DATA_LENGTH TABLES.INDEX_LENGTH TABLES.MAX_DATA_LENGTH TABLES.TABLE_ROWS TABLES.UPDATE_TIME
これらのカラムは、動的テーブルメタデータ、つまりテーブルの内容の変更に応じて変更される情報を表します。
デフォルトでは、MySQL は、カラムのクエリー時に mysql.index_stats
および mysql.table_stats
ディクショナリテーブルからこれらのカラムのキャッシュされた値を取得します。これは、ストレージエンジンから統計を直接取得するよりも効率的です。 キャッシュされた統計が使用できないか、期限切れになっている場合、MySQL はストレージエンジンから最新の統計を取得し、mysql.index_stats
および mysql.table_stats
ディクショナリテーブルにキャッシュします。 後続のクエリーでは、キャッシュされた統計が期限切れになるまで、キャッシュされた統計が取得されます。
information_schema_stats_expiry
セッション変数は、キャッシュされた統計が期限切れになるまでの期間を定義します。 デフォルトは 86400 秒 (24 時間) ですが、期間は 1 年まで延長できます。
特定のテーブルのキャッシュされた値をいつでも更新するには、ANALYZE TABLE
を使用します。
次の場合、統計カラムのクエリーでは、mysql.index_stats
および mysql.table_stats
ディクショナリテーブルの統計は格納または更新されません:
キャッシュされた統計が失効していない場合。
information_schema_stats_expiry
が 0 に設定されている場合。サーバーが
read_only
,super_read_only
,transaction_read_only
またはinnodb_read_only
モードで起動されたとき。クエリーでパフォーマンススキーマデータもフェッチされる場合。
information_schema_stats_expiry
はセッション変数であり、各クライアントセッションで独自の有効期限値を定義できます。 ストレージエンジンから取得され、あるセッションによってキャッシュされた統計は、ほかのセッションで使用できます。
innodb_read_only
システム変数が有効になっている場合、InnoDB
を使用するデータディクショナリの統計テーブルを更新できないため、ANALYZE TABLE
が失敗することがあります。 キー分散を更新する ANALYZE TABLE
操作では、操作によってテーブル自体が更新された場合でも (MyISAM
テーブルの場合など)、障害が発生する可能性があります。 更新された分散統計を取得するには、information_schema_stats_expiry=0
を設定します。
データディクショナリテーブルのビューとして実装された INFORMATION_SCHEMA
テーブルの場合、基礎となるデータディクショナリテーブルのインデックスを使用すると、オプティマイザで効率的なクエリー実行計画を作成できます。 オプティマイザによる選択を確認するには、EXPLAIN
を使用します。 サーバーが INFORMATION_SCHEMA
クエリーを実行するために使用するクエリーも表示するには、EXPLAIN
の直後に SHOW WARNINGS
を使用します。
utf8mb4
文字セットの照合順序を識別する次のステートメントについて考えてみます:
Press CTRL+C to copymysql> SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME = 'utf8mb4'; +----------------------------+ | COLLATION_NAME | +----------------------------+ | utf8mb4_general_ci | | utf8mb4_bin | | utf8mb4_unicode_ci | | utf8mb4_icelandic_ci | | utf8mb4_latvian_ci | | utf8mb4_romanian_ci | | utf8mb4_slovenian_ci | ...
サーバーはこのステートメントをどのように処理しますか。 確認するには、EXPLAIN
を使用します:
Press CTRL+C to copymysql> EXPLAIN SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME = 'utf8mb4'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: cs partitions: NULL type: const possible_keys: PRIMARY,name key: name key_len: 194 ref: const rows: 1 filtered: 100.00 Extra: Using index *************************** 2. row *************************** id: 1 select_type: SIMPLE table: col partitions: NULL type: ref possible_keys: character_set_id key: character_set_id key_len: 8 ref: const rows: 68 filtered: 100.00 Extra: NULL 2 rows in set, 1 warning (0.01 sec)
そのステートメントの静的化に使用されたクエリーを表示するには、SHOW WARNINGS
を使用します:
Press CTRL+C to copymysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select `mysql`.`col`.`name` AS `COLLATION_NAME` from `mysql`.`character_sets` `cs` join `mysql`.`collations` `col` where ((`mysql`.`col`.`character_set_id` = '45') and ('utf8mb4' = 'utf8mb4'))
SHOW WARNINGS
で示されているように、サーバーは、mysql
システムデータベースの character_sets
および collations
データディクショナリテーブルに対するクエリーとして COLLATION_CHARACTER_SET_APPLICABILITY
に対するクエリーを処理します。