10bet网址
MySQL 5.6リファレンスマニュアル
下载本手册
PDF(美国高级主任)- 26.8 mb
PDF (A4)- 26.8 mb


8.2.4 information_schemaクエリ,の最適化

デ,タベ,スをモニタ,するアプリケ,ションでは,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_TABLESKIP_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テ,ブルのいずれでもないため,最適化は適用されません。