MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  パフォーマンススキーマクエリーの最適化

8.2.4 パフォーマンススキーマクエリーの最適化

データベースを監視するアプリケーションでは、「パフォーマンススキーマ」テーブルを頻繁に使用できます。 これらのテーブルに対するクエリーを最も効率的に記述するには、インデックスを利用します。 たとえば、インデックス付けされたカラムの特定の値との比較に基づいて、取得される行を制限する WHERE 句を含めます。

「最もパフォーマンスの高いスキーマ」テーブルにはインデックスがあります。 通常は少数の行を含むテーブルではないか、頻繁にクエリーが行われる可能性が低いテーブル。 パフォーマンススキーマインデックスを使用すると、オプティマイザは全テーブルスキャン以外の実行計画にアクセスできます。 これらのインデックスは、それらのテーブルを使用する sys スキーマビューなど、関連するオブジェクトのパフォーマンスも向上します。

特定の「パフォーマンススキーマ」テーブルにインデックスがあるかどうかとその内容を確認するには、SHOW INDEX または SHOW CREATE TABLE を使用します:

mysql> SHOW INDEX FROM performance_schema.accounts\G
*************************** 1. row ***************************
        Table: accounts
   Non_unique: 0
     Key_name: ACCOUNT
 Seq_in_index: 1
  Column_name: USER
    Collation: NULL
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: HASH
      Comment:
Index_comment:
      Visible: YES
*************************** 2. row ***************************
        Table: accounts
   Non_unique: 0
     Key_name: ACCOUNT
 Seq_in_index: 2
  Column_name: HOST
    Collation: NULL
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: HASH
      Comment:
Index_comment:
      Visible: YES

mysql> SHOW CREATE TABLE performance_schema.rwlock_instances\G
*************************** 1. row ***************************
       Table: rwlock_instances
Create Table: CREATE TABLE `rwlock_instances` (
  `NAME` varchar(128) NOT NULL,
  `OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
  `WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
  `READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL,
  PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`),
  KEY `NAME` (`NAME`),
  KEY `WRITE_LOCKED_BY_THREAD_ID` (`WRITE_LOCKED_BY_THREAD_ID`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

パフォーマンススキーマクエリーの実行計画およびインデックスを使用するかどうかを確認するには、EXPLAIN を使用します:

mysql> EXPLAIN SELECT * FROM performance_schema.accounts
       WHERE (USER,HOST) = ('root','localhost')\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: accounts
   partitions: NULL
         type: const
possible_keys: ACCOUNT
          key: ACCOUNT
      key_len: 278
          ref: const,const
         rows: 1
     filtered: 100.00
        Extra: NULL

EXPLAIN 出力は、USER カラムと HOST カラムで構成される accounts テーブルの ACCOUNT インデックスをオプティマイザが使用することを示しています。

パフォーマンススキーマのインデックスは仮想です: これらはパフォーマンススキーマストレージエンジンの構成であり、メモリーやディスクストレージを使用しません。 パフォーマンススキーマは、効率的な実行計画を構築できるように、オプティマイザにインデックス情報を報告します。 パフォーマンススキーマは、実際のインデックス構造を構築せずに効率的な検索を実行できるように、検索対象に関するオプティマイザ情報 (特定のキー値など) を使用します。 この実装には、次の 2 つの重要な利点があります:

  • 頻繁に更新されるテーブルで通常発生するメンテナンスコストを完全に回避します。

  • これにより、クエリー実行の初期段階で取得されるデータ量が削減されます。 インデックス付きカラムの条件の場合、パフォーマンススキーマはクエリー条件を満たすテーブル行のみを効率的に返します。 インデックスがない場合、パフォーマンススキーマはテーブル内のすべての行を返すため、オプティマイザはあとで各行に対して条件を評価して最終結果を生成する必要があります。

パフォーマンススキーマのインデックスは事前定義されており、削除、追加、または変更できません。

パフォーマンススキーマのインデックスはハッシュインデックスに似ています。 例:

  • これらは、= または <=> 演算子を使用する等価比較にのみ使用されます。

  • これらは順序付けられていません。 クエリー結果に特定の行順序付け特性が必要な場合は、ORDER BY 句を含めます。

ハッシュインデックスの詳細は、セクション8.3.9「B ツリーインデックスとハッシュインデックスの比較」 を参照してください。


関連キーワード:  インデックス, テーブル, InnoDB, パフォーマンス, クエリー, スキーマ, ステートメント, 結合, カラム, オプティマイザ