デ,タベ,スをモニタ,するアプリケ,ションでは,INFORMATION_SCHEMA
テ,ブルを頻繁に使用することがあります。INFORMATION_SCHEMA
テ,ブルに対する特定の種類のクエリ,は,高速に実行するように最適化できます。この目標は,ファイル操作(ディレクトリのスキャンやテーブルファイルを開くなど)を最小限にし,これらの動的テーブルを構成する情報を収集することです。これらの最適化は,INFORMATION_SCHEMA
テ,ブルの検索にどのような照合順序が使われるかに影響します。詳細は,セクション10.1.7.9 "照合順序とinformation_schema検索"を参照してください。
1)在哪里
句のデ,タベ,ス名とテ,ブル名には定数のルックアップ値を使用してみます
この原則は次のように活用できます。
データベースやテーブルをルックアップするには,リテラル値,定数を返す関数,スカラーサブクエリーなど,定数に評価される式を使用します。
一致するデータベースディレクトリ名を見つけるためにデータディレクトリのスキャンが必要になるため,非定数のデータベース名ルックアップ値を使用する(またはルックアップ値を使用しない)クエリーを避けます。
データベース内では,一致するテーブルファイルを見つけるためにデータベースディレクトリのスキャンが必要になるため,非定数のテーブル名ルックアップ値を使用する(またはルックアップ値を使用しない)クエリーを避けます。
この原則は,定数のルックアップ値によって,サーバーがディレクトリスキャンを回避できるカラムを示している次の表で示されているINFORMATION_SCHEMA
テ,ブルに適用されます。たとえば,表
から選択する場合は,在哪里
句でTABLE_SCHEMA
に定数のルックアップ値を使用すると,デ,タディレクトリのスキャンを回避できます。
テブル | デ,タディレクトリスキャンを避けるために指定するカラム | デ,タベ,スディレクトリスキャンを避けるために指定するカラム |
---|---|---|
列 |
TABLE_SCHEMA |
TABLE_NAME |
KEY_COLUMN_USAGE |
TABLE_SCHEMA |
TABLE_NAME |
分区 |
TABLE_SCHEMA |
TABLE_NAME |
REFERENTIAL_CONSTRAINTS |
CONSTRAINT_SCHEMA |
TABLE_NAME |
统计数据 |
TABLE_SCHEMA |
TABLE_NAME |
表 |
TABLE_SCHEMA |
TABLE_NAME |
TABLE_CONSTRAINTS |
TABLE_SCHEMA |
TABLE_NAME |
触发器 |
EVENT_OBJECT_SCHEMA |
EVENT_OBJECT_TABLE |
的观点 |
TABLE_SCHEMA |
TABLE_NAME |
特定の定数のデータベース名に制限されたクエリーの利点は,指定したデータベースディレクトリのみをチェックするだけで済むことです。例:
从information_schema中选择table_name。table WHERE TABLE_SCHEMA = 'test';
リテラルのデ,タベ,ス名测试
を使用すると,デタベスがいくあるかに関係なく,サバは测试
デ,タベ,スディレクトリだけをチェックできます。対照的に,次のクエリ,では,パタ,ン“测试%”
に一致するデータベース名を特定するために,データディレクトリのスキャンが必要であるため,効率が低下します。
从information_schema中选择table_name。TABLE_SCHEMA LIKE 'test%';
特定の定数のテーブル名に制限されたクエリーの場合,対応するデータベースディレクトリ内の指定したテーブルのみをチェックするだけで済みます。例:
从information_schema中选择table_name。表在哪里TABLE_SCHEMA= 'test' AND TABLE_NAME = 't1';
リテラルのテ,ブル名t1
を使用すると,测试
デタベスにテブルがいくあるかに関係なく,サバはt1
テブルのファルだけをチェックできます。対照的に,次のクエリ,では,パタ,ン“t %”
に一致するテ,ブル名を特定するために,测试
デ,タベ,スディレクトリのスキャンが必要です。
从information_schema中选择table_name。表在哪里TABLE_SCHEMA= 'test' AND TABLE_NAME LIKE 't%';
次のクエリ,では,パタ,ン“测试%”
に一致するデータベース名を特定するためにデータディレクトリをスキャンする必要があり,一致するデータベースごとに,パターン“t %”
に一致するテ,ブル名を特定するためにデ,タベ,スディレクトリをスキャンする必要があります。
从information_schema中选择table_name。表在哪里TABLE_SCHEMA= 'test%' AND TABLE_NAME LIKE 't%';
2)開く必要のあるテブルファルの数が最小になるクエリを書きます
特定のINFORMATION_SCHEMA
テーブルカラムを参照するクエリーでは,開く必要のあるテーブルファイルの数を最小にするいくつかの最適化を使用できます。例:
从information_schema中选择table_name, engine。table WHERE TABLE_SCHEMA = 'test';
この場合,サーバーがデータベースディレクトリをスキャンしてデータベース内のテーブルの名前を特定したら,さらにファイルシステムをルックアップしなくても,それらの名前を使用できるようになります。したがって,TABLE_NAME
はファ@ @ルを開く必要はありません。引擎
(ストレ,ジエンジン)の値は,テ,ブルの.frm
ファ电子邮箱ルを開くことで特定でき,.MYD
や.MYI
などのほかのテブルファルにアクセスすることはありません。
MyISAM
テ,ブルのINDEX_LENGTH
など,一部の値では.MYD
または.MYI
ファ@ @ルも開く必要があります。
ファ。
SKIP_OPEN_TABLE
:テブルファルを開く必要はありません。データベースディレクトリをスキャンすることによって,クエリー内ですでに情報を使用できるようになっています。OPEN_FRM_ONLY
:テ,ブルの.frm
ファ@ @ルのみを開く必要があります。OPEN_TRIGGER_ONLY
:テ,ブルの.TRG
ファ@ @ルのみを開く必要があります。OPEN_FULL_TABLE
:最適化されていない情報のルックアップ。.frm
、.MYD
,および.MYI
ファ@ @ルを開く必要があります。
次のリストに,上記の最適化の種類がどのようにINFORMATION_SCHEMA
テ,ブルカラムに適用されるかを示します。指定されていないテ,ブルとカラムには,最適化が適用されません。
列
:OPEN_FRM_ONLY
がすべてのカラムに適用されますKEY_COLUMN_USAGE
:OPEN_FULL_TABLE
がすべてのカラムに適用されます分区
:OPEN_FULL_TABLE
がすべてのカラムに適用されますREFERENTIAL_CONSTRAINTS
:OPEN_FULL_TABLE
がすべてのカラムに適用されます统计数据
:カラム 最適化の種類 TABLE_CATALOG
OPEN_FRM_ONLY
TABLE_SCHEMA
OPEN_FRM_ONLY
TABLE_NAME
OPEN_FRM_ONLY
NON_UNIQUE
OPEN_FRM_ONLY
INDEX_SCHEMA
OPEN_FRM_ONLY
INDEX_NAME
OPEN_FRM_ONLY
SEQ_IN_INDEX
OPEN_FRM_ONLY
COLUMN_NAME
OPEN_FRM_ONLY
排序
OPEN_FRM_ONLY
基数
OPEN_FULL_TABLE
SUB_PART
OPEN_FRM_ONLY
包装
OPEN_FRM_ONLY
可以为空
OPEN_FRM_ONLY
INDEX_TYPE
OPEN_FULL_TABLE
评论
OPEN_FRM_ONLY
表
:カラム 最適化の種類 TABLE_CATALOG
SKIP_OPEN_TABLE
TABLE_SCHEMA
SKIP_OPEN_TABLE
TABLE_NAME
SKIP_OPEN_TABLE
TABLE_TYPE
OPEN_FRM_ONLY
引擎
OPEN_FRM_ONLY
版本
OPEN_FRM_ONLY
ROW_FORMAT
OPEN_FULL_TABLE
TABLE_ROWS
OPEN_FULL_TABLE
AVG_ROW_LENGTH
OPEN_FULL_TABLE
DATA_LENGTH
OPEN_FULL_TABLE
MAX_DATA_LENGTH
OPEN_FULL_TABLE
INDEX_LENGTH
OPEN_FULL_TABLE
DATA_FREE
OPEN_FULL_TABLE
AUTO_INCREMENT
OPEN_FULL_TABLE
CREATE_TIME
OPEN_FULL_TABLE
UPDATE_TIME
OPEN_FULL_TABLE
CHECK_TIME
OPEN_FULL_TABLE
TABLE_COLLATION
OPEN_FRM_ONLY
校验和
OPEN_FULL_TABLE
CREATE_OPTIONS
OPEN_FRM_ONLY
TABLE_COMMENT
OPEN_FRM_ONLY
TABLE_CONSTRAINTS
:OPEN_FULL_TABLE
がすべてのカラムに適用されます触发器
:OPEN_TRIGGER_ONLY
がすべてのカラムに適用されます的观点
:カラム 最適化の種類 TABLE_CATALOG
OPEN_FRM_ONLY
TABLE_SCHEMA
OPEN_FRM_ONLY
TABLE_NAME
OPEN_FRM_ONLY
VIEW_DEFINITION
OPEN_FRM_ONLY
CHECK_OPTION
OPEN_FRM_ONLY
IS_UPDATABLE
OPEN_FULL_TABLE
定义者
OPEN_FRM_ONLY
SECURITY_TYPE
OPEN_FRM_ONLY
CHARACTER_SET_CLIENT
OPEN_FRM_ONLY
COLLATION_CONNECTION
OPEN_FRM_ONLY
3)解释
を使用して,サ,バ,がクエリ,にINFORMATION_SCHEMA
最適化を使用できるかどうかを判断します
これは特に,複数のデータベースの情報を検索し,長時間かかり,パフォーマンスに影響を与える可能性のあるINFORMATION_SCHEMA
クエリ,に適用されます。先述の最適化のう,サバがINFORMATION_SCHEMA
クエリ,の評価に使用できるものがあれば,解释
の出力の额外的
値に示されます。次の例は,额外的
値に表示されることが予想される情報の種類を示しています。
说明:SELECT TABLE_NAME FROM INFORMATION_SCHEMA的观点在哪里-> TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v1'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: VIEWS type: ALL possible_keys: NULL key: TABLE_SCHEMA,TABLE_NAME key_len: NULL ref: NULL rows: NULL Extra: Using where; Open_frm_only; Scanned 0 databases
定数のデータベースルックアップ値およびテーブルルックアップ値を使用すると,サーバーはディレクトリスキャンを回避できます。的观点。TABLE_NAME
の参照では,.frm
ファ@ @ルのみを開く必要があります。
说明:SELECT INFORMATION_SCHEMA中的TABLE_NAME, ROW_FORMAT。表\ g ***************************row *************************** id: 1 select_type: SIMPLE table: TABLES type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL Extra: Open_full_table;扫描所有数据库
ルックアップ値が指定されていない(在哪里
句がない)ため,サーバーはデータディレクトリと各データベースディレクトリをスキャンする必要があります。このようにして特定された各テブルにいて,テブル名と行フォマットが選択されます。TABLE_NAME
では、さらにテ、ブルファ、ルを開く必要はありません(SKIP_OPEN_TABLE
最適化が適用されます)。ROW_FORMAT
では、すべてのテ、ブルファ、ルを開く必要があります(OPEN_FULL_TABLE
が適用されます)。解释
はOPEN_FULL_TABLE
(SKIP_OPEN_TABLE
より負荷が大きいため)をレポ,トします。
从信息schema中选择TABLE_NAME, TABLE_TYPE。表-> WHERE TABLE_SCHEMA = 'test'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: TABLES type: ALL possible_keys: NULL key: TABLE_SCHEMA key_len: NULL ref: NULL rows: NULL Extra: Using where; Open_frm_only; Scanned 1 database
テ,ブル名のルックアップ値が指定されていないため,サ,バ,は测试
デ,タベ,スディレクトリをスキャンする必要があります。TABLE_NAME
カラムとTABLE_TYPE
カラムには,それぞれSKIP_OPEN_TABLE
最適化とOPEN_FRM_ONLY
最適化が適用されます。解释
はOPEN_FRM_ONLY
(これの方が負荷が大きいため)をレポ,トします。
说明:SELECT B.TABLE_NAME -> FROM INFORMATION_SCHEMA表作为一个,information_schema。列AS B -> WHERE A.TABLE_SCHEMA = 'test' -> AND A.TABLE_NAME = 't1' -> AND B.TABLE_NAME = A.TABLE_NAME\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: A type: ALL possible_keys: NULL key: TABLE_SCHEMA,TABLE_NAME key_len: NULL ref: NULL rows: NULL Extra: Using where; Skip_open_table; Scanned 0 databases *************************** 2. row *************************** id: 1 select_type: SIMPLE table: B type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL Extra: Using where; Open_frm_only; Scanned all databases; Using join buffer
最初の解释
出力行の場合:定数のデ,タベ,スルックアップ値およびテ,ブルルックアップ値により,サ,バ,は表
の値のディレクトリスキャンを回避できます。表。TABLE_NAME
の参照には,さらにテ,ブルファ,ルは必要ありません。
2めの解释
出力行の場合:列
テ,ブルのすべての値がOPEN_FRM_ONLY
ルックアップであるため,列。TABLE_NAME
では,.frm
ファ@ @ルを開く必要があります。
说明SELECT * FROM INFORMATION_SCHEMA整理\ g ***************************row *************************** id: 1 select_type: SIMPLE table: COLLATIONS type: ALL possible - _keys: NULL key: NULL key_len: NULL ref: NULL rows: NULL
この場合,整理
は最適化を使用できるINFORMATION_SCHEMA
テ,ブルのいずれでもないため,最適化は適用されません。